[Linux]バックグラウンドで起動したプロセスをKillする方法
ターミナルを起動してサーバをフォアグラウンドで起動していると、ターミナルを閉じたタイミングでフォアグラウンドタスクも一緒に殺されてしまい、その後サーバにアクセスができなくなる。
これを防止するためにバックグラウンドプロセスとしてサーバ起動を行うと便利である。Railsのサーバ起動を例に挙げると、次のように起動させることができる。
rails s -d
-dはDaemonの略でありバックグラウンドで起動するという意味である。これを起動させたものの終了のさせ方をどうしたら良いか?というのが今回の趣旨である。
Daemonはバックグラウンドで起動するUnixまたはLinuxのプロセスのことである。他の呼び方としては常駐プログラム。
psコマンドで現在起動しているプロセスを調査
現在起動中のプロセスを調べるコマンドとしてpsコマンドがLinuxには用意されている。man ps
で調査すると次のように記述されている。
ps - report a snapshot of the current processes (現在起動中プロセスのスナップショットを報告する)
試しにpsコマンドを叩くと次のように出力される。
$ ps
PID TTY TIME CMD
21283 pts/0 00:00:00 bash
30562 pts/0 00:00:00 ps
オプションなしの状態で出力されるのはbash(ターミナル)と今叩いたpsコマンドのプロセスだけである。自分自身のbashは殺す事ができないため、もう一つターミナルを起動してそこから21283のプロセスを殺してやる。
kill 21283
これでターミナルを閉じる事ができる。
ps -axuで全てのプロセスを調査
psコマンドだけ打つと、全てのプロセスを表示することができないので、ps -axuオプションにより表示させてやる。
$ ps axu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
...(省略)
apache 30382 0.0 7.9 710672 161964 ? Sl Mar10 0:11 Passenger AppPreloader: /var/lib/redmine (forking...)
root 30528 0.0 0.1 124668 2048 ? Ss Feb14 0:00 /usr/sbin/abrtd -d -s
root 30556 0.0 0.0 122160 788 ? Ss Feb14 0:01 /usr/bin/abrt-watch-log -F BUG: WARNING: at WARNING: CPU: INFO: po
root 30803 0.0 0.0 112920 1228 ? Ss Feb14 0:17 /usr/sbin/sshd -D
apache 31800 0.0 0.2 327252 5328 ? S Mar13 0:00 /usr/sbin/httpd -DFOREGROUND
yamanaka 32234 0.0 7.5 1513144 154132 ? Sl Mar12 0:22 puma 4.3.3 (tcp://0.0.0.0:3000) [/]
USER(プロセスを起動したユーザ)、START(最初に起動した日付)、COMMAND(プロセスが起動した時のコマンド) 等を参考にし、それらしいプロセスに目星をつけていく。
今回の場合、
yamanaka 32234 0.0 7.5 1513144 154132 ? Sl Mar12 0:22 puma 4.3.3 (tcp://0.0.0.0:3000) [/]
の部分が該当しそうなので、このPIDに該当するプロセスを殺してやる。
kill 32234
これで再度ブラウザにアクセスして、起動できていなければ成功である。
起動中のプロセスが多すぎて探せない場合
ps auxを実行すると、大量にプロセスが表示されるため時に探すのが困難な場合がある。そんな時は目星をつけてgrepで表示させてやれば良い。例えばapacheのプロセスだけを表示させたい場合には
ps axu | grep apache
としてやれば、その結果のみを取り出すことができて便利である。