killallやpkill 使っていますか!
Linucの勉強をしていてkillallやpgrepの便利さに感動したのでシェアしたいと思い記事を書きました。
一つのプロセスをキルする目的であればkillコマンドで事足りますが、複数のプロセスをキルしないといけない場合はkillallやpkillを使ったほうが良いです。
killとkillallの違い
- killはプロセスIDを指定するが、killallはプロセス名を指定する
- killは1つのプロセスをキルするが、killallは複数のプロセスをキルする
実際に使ってみよう
実際にkillallを使うシチュエーションを再現して、killallを使ってみましょう。
↓のシェルスクリプトを作ってください。
今回はファイル名killall_test.sh
としました。
#!/bin/bash
while true; do
echo "無限ループなう"
sleep 1
done
実行権限を付与します。
chmod u+x killall_test.sh
バックグラウンドでkillall_test.shを実行するコマンドを複数回実行します。(実行した回数だけプロセスが増えます)
nohup ./killall_test.sh &
psコマンドでkillall_test.shのプロセスが立ち上がっているか確認しましょう
ps x | grep killall
6つ立ち上がっているようです。
404506 pts/0 S 0:00 /bin/bash ./killall_test.sh
404565 pts/0 S 0:00 /bin/bash ./killall_test.sh
404620 pts/0 S 0:00 /bin/bash ./killall_test.sh
404677 pts/0 S 0:00 /bin/bash ./killall_test.sh
404735 pts/0 S 0:00 /bin/bash ./killall_test.sh
404792 pts/0 S 0:00 /bin/bash ./killall_test.sh
404958 pts/0 S+ 0:00 grep --color=auto killall
killall killall_test.sh
を実行してみましょう
すると
6つ立ち上がっていたkillall_test.shにSIGTERMが送られてプロセスが終了されました。
[1] Terminated nohup ./killall_test.sh
[2] Terminated nohup ./killall_test.sh
[3] Terminated nohup ./killall_test.sh
[4] Terminated nohup ./killall_test.sh
[5]- Terminated nohup ./killall_test.sh
[6]+ Terminated nohup ./killall_test.sh
killallでもプロセスがキルされないときは
killallやkillはSIGTERMをプロセスに送るのがデフォルトの挙動になります。
SIGTERMはプロセスに「終了してください」という命令を送って終了させるものなので、暴走してるプロセスはSIGTERMでは終了しない場合があります。
そのような場合はkillall -s SIGKILL killall_test.sh
のようにSIGKILLを指定することで強制的にプロセスをキルすることができます。(強制終了なのでSIGTERMで終了出来ない時にのみ使用するのが望ましいかと思います。)
SIGKILLでkillallすると↓のようになります。
先程のTerminatedがKilledに変わっているのが確認できると思います。
[1] Killed nohup ./killall_test.sh
[2] Killed nohup ./killall_test.sh
[3] Killed nohup ./killall_test.sh
[4] Killed nohup ./killall_test.sh
[5]- Killed nohup ./killall_test.sh
[6]+ Killed nohup ./killall_test.sh