プロセスを kill するコマンド
Linux でプロセスを強制的に終了させるには kill
コマンドを使用します。
kill コマンド でシグナル送信
kill
コマンドはプロセス(ジョブ)に対してシグナルを送ります。プロセスは送信されたシグナルを受けて、何かしらのふるまいを行います。
もし強制的にプロセスを終了させたい場合は、SIGKILL
シグナル(シグナル番号9)を送信します。SIGKILL
を受け取ったプロセスは強制的に終了させられます。
kill -9: 強制終了
kill -9 [PID]
で指定されたプロセス番号のプロセスを強制的に終了させられます。例えば sleep 1000 &
で1000秒待機するだけの処理をバックグラウンドで実行します。実行すると PID が表示されるのでそれを kill
してみます。
# 1000秒待機をバックグラウンドで実行(PID=818)
$ sleep 1000 &
[1] 818
# PID=818 を強制終了
$ kill -9 818
# プロセス終了を確認
$ ps
PID TTY TIME CMD
603 tty1 00:00:00 bash
820 tty1 00:00:00 ps
[1]+ Killed sleep 1000
kill
した後、ps
コマンドでプロセスを確認すると kill
が確認できました。
コマンドのシグナルいろいろ
kill -l
で kill
コマンドが送信できるシグナルが一覧できます。
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
シグナル番号とシグナル名が確認できます。kill
コマンドはシグナル番号でもシグナル名でも指定可能です。
すべてのシグナルを覚えるのは大変ですので代表的なものだけまとめます。
シグナル番号 | シグナル名 | 意味 |
---|---|---|
1 | SIGHUP | ハングアップ。端末の回線が切れたときに発生するシグナル。nohup でプロセスが SIGHUP を受け付けなくなる。 |
2 | SIGINT | 割り込み。Ctrl+C 押下で送信されるシグナル。デフォルトでプロセスを終了させる。 |
3 | SIGQUIT | 中止。Ctrl+\ 押下で送信されるシグナル。 |
9 | SIGKILL | 強制終了シグナル。 |
15 | SIGTERM | 終了シグナル。シグナル番号省略時のデフォルト。無視できる。 |
20 | SIGTSTP | 端末からの一時中断シグナル。Ctrl+Z 押下で送信されるシグナル。バックグラウンドに処理を移すときなどに使う。 |
その他いろいろあるシグナルは man 7 signal
で確認したいり、Wikipedia のページを確認してください。
シグナルをキャッチする
シグナルに対してプロセスがどのようにふるまうかはプロセス側の実装に依存します。
例えばシェルスクリプトを以下のように実装すると、任意シグナルをキャッチできます。
シグナルは複数同時にスペース区切りで指定できます。
trap [任意コマンド] [シグナルリスト]
以下のスクリプトは Ctrl+C
押下で送信される SIGINT
をキャッチしてみます。
my_script.sh
#!/bin/bash
trap 'echo "catch SIGINT"' 2
sleep 10000
以下のように実行し、Ctrl+C
を押下してみます。
$ bash my_script.sh
^Ccatch SIGINT
SIGINT
のシグナルをキャッチして任意の処理が実行できました。
シグナルを無視する
送信されたシグナルは無視することもできます。例えば Ctrl+C
を無視して勝手に終了されないようにもできます。
my_script.sh
#!/bin/bash
# Ctrl+C で送信される SIGINT を無視する
trap '' SIGINT
sleep 10000
trap '' SIGINT
でシグナルキャッチ時の処理を空文字で何も指定しないと処理をせず無視します。終了もしません。実行して Ctrl+C
を押下してみます。
# Ctrl+C を押下しても反応しない
$ bash my_script.sh
^C^C^C^C^C^C^C^C^C
Ctrl+C
を押下しても終了しません。早く終了したければ10000秒待つか kill
するかログアウトしてください。
trap '' SIGKILL
としても強制的にプロセスを終了するのは無視できません。
以上。
コメントを書く