killやpkillを使って対象のプロセスを探して停止する方法を紹介します。
killコマンドで不要なプロセスを停止する
プロセスを停止するタイミングは?
プロセスを停止したいタイミング
- 停止したはずのアプリのプロセスが残っていて気持ち悪い
- 正常な方法でアプリが停止できない
- 自作のスクリプトにループ処理があって暴走した
プロセス停止するタイミングは緊急時が多いので慣れておくと有事の際に役立ちます。
プロセスを確認する
停止するプロセスを確認するには以下のコマンドを使います。
- ps (ps aux, ps -auxwf)
- top
- pgrep
プロセス停止で使うのはpsかpgrepだと思います。
Apacheのプロセスを確認してみます。
# ps -auxw | grep -i apache
root 539316 0.0 0.0 7576 4520 ? Ss 12:30 0:00 /usr/sbin/apache2 -k start
www-data 539317 0.0 0.0 2001280 4648 ? Sl 12:30 0:00 /usr/sbin/apache2 -k start
www-data 539318 0.0 0.0 2001280 4648 ? Sl 12:30 0:00 /usr/sbin/apache2 -k start
root 539393 0.0 0.0 6416 1840 pts/0 S+ 12:31 0:00 grep --color=auto -i apache
この見方だとgrepしている打ったコマンドのプロセスが見えてしまっているので工夫します
# ps -auxw | grep -i [a]pache
root 539316 0.0 0.0 7576 4520 ? Ss 12:30 0:00 /usr/sbin/apache2 -k start
www-data 539317 0.0 0.0 2001280 4648 ? Sl 12:30 0:00 /usr/sbin/apache2 -k start
www-data 539318 0.0 0.0 2001280 4648 ? Sl 12:30 0:00 /usr/sbin/apache2 -k start
実際に起動しているのは3つのプロセスです。
pgrepを使うとプロセスの名前でマッチしてプロセス番号を返します
・iオプションは大文字小文字を無視する
# pgrep -i apache
539316
539317
539318
・fオプションはプロセス名以外のコマンドライン全体にマッチする
# pgrep -f apache
539316
539317
539318
プロセスを停止する
プロセスを停止するコマンド
- kill -9 [プロセス番号]
- pkill [プロセス名]
- killall [プロセス名]
落としたいプロセスが3つくらいまでならkilコマンドでやってしまいます。
まずはpsコマンドでプロセスを確認します。
# ps -axw | grep -i [n]ginx
root ? Ss 11:40 0:00 nginx: master process nginx
nginx ? S 11:40 0:00 nginx: worker process
nginx ? S 11:40 0:00 nginx: worker process
nginx ? S 11:40 0:00 nginx: worker process
nginx ? S 11:40 0:00 nginx: worker process
# for i in {3..7}; do kill -9 53906${i} ; done
( kill -9 539063 539064 539065 539066 539067とやっても良い)
# ps -auxw | grep -i [n]ginx
・同じ名前のプロセスが複数上がっているときはkillallを使っても良い
# killall nginx
pgrepでプロセス番号が出るのでそれをwhileでkill -9に渡して停止しても良い
# pgrep -i nginx | while read ps ;do kill -9 ${ps} ; done
大量のプロセス停止はpkillが楽
バグでプロセスが大量に湧いてしまっている時はkillコマンドでやるのは大変なのでpkillを使います。
# pkill -i nginx
# pkill -efi nginx
pgrepで確認してpkillで停止します。
プロセス名でヒットしないプロセスがある場合は-fを入れましょう。
-eでキルしたプロセスを表示・確認できます。