killコマンドはプロセスにデフォルトとしてTERMシグナルを送信し、そのプロセスを終了できます。
また、killコマンドはプロセスを強制終了させたいときにも、よく利用されます。
その場合は、killコマンドはKILLシグナルを送信して、プロセスを強制終了させます。
目次
シグナルとは
シグナル(signal)は、日本語では信号という意味になります。シグナルにはいくつか種類があり、それぞれのシグナルにはどのような処理を行うかが決まっています。プロセスに対して、シグナルを送信すると、プロセスはその決まった処理を実行します。
シグナルには、どのような処理が行われるかがデフォルトですでに決められています。
デフォルトのアクション
アクション | 意味 |
Term | プロセスの終了 |
Ign | シグナルを無視 |
Core | プロセスの終了とコアダンプファイルの作成 |
Stop | プロセスの停止 |
Cont | 停止中のプロセスを再開 |
シグナルはどのようなときに送信されるかどうかも決められています。
例えば、POSIX.1-1990 に定義されている実際のシグナルは以下のような表になります。
POSIX.1-1990のシグナル表
シグナル | 値 | アクション | 意味(シグナル送信のタイミング等) |
SIGHUP | 1 | Term | 制御端末のハングアップ(操作不能状態)の検出や 制御しているプロセスの死 |
SIGINT | 2 | Term | キーボードからの割り込み (Interrupt) |
SIGQUIT | 3 | Core | キーボードによる中止 (Quit) |
SIGILL | 4 | Core | 不正な命令 |
SIGABRT | 6 | Core | abort(3) からの中断 (Abort) シグナル |
SIGFPE | 8 | Core | 浮動小数点例外 |
SIGKILL | 9 | Term | Kill シグナル |
SIGSEGV | 11 | Core | 不正なメモリー参照 |
SIGPIPE | 13 | Term | パイプ破壊: 読み手の無いパイプへの書き出し |
SIGALRM | 14 | Term | alarm(2) からのタイマーシグナル |
SIGTERM | 15 | Term | 終了 (termination) シグナル |
SIGUSR1 | 30,10,16 | Term | ユーザー定義シグナル 1 |
SIGUSR2 | 31,12,17 | Term | ユーザー定義シグナル 2 |
SIGCHLD | 20,17,18 | Ign | 子プロセスの一時停止 (stop) または終了 |
SIGCONT | 19,18,25 | Cont | 一時停止 (stop) からの再開 |
SIGSTOP | 17,19,23 | Stop | プロセスの一時停止 (stop) |
SIGTSTP | 18,20,24 | Stop | 端末より入力された一時停止 (stop) |
SIGTTIN | 21,21,26 | Stop | バックグランドプロセスの端末入力 |
SIGTTOU | 22,22,27 | Stop | バックグランドプロセスの端末出力 |
(参考:Man page of SIGNAL)
killコマンドの利用例
プロセスの終了
killコマンドはプロセスID(PID)を指定すると、デフォルトではTERM(15)シグナルを指定したプロセスに送信して、プロセスを終了させます。また、プロセスIDの確認方法としてpsコマンドが利用できます。
ここでは、test.shというスクリプトをバックグラウンドで実行させて、そのプロセスを終了させていきます。
test.sh
1 2 3 4 5 6 |
#!/bin/bash sleep 1000 & sleep 1000 & sleep 1000 & sleep 1000 |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
$./test.sh & [1] 3502 $ $ps PID TTY TIME CMD 2719 pts/2 00:00:00 bash 3502 pts/2 00:00:00 test.sh 3503 pts/2 00:00:00 sleep 3504 pts/2 00:00:00 sleep 3505 pts/2 00:00:00 sleep 3506 pts/2 00:00:00 sleep 3507 pts/2 00:00:00 ps $ $kill 3502 $ps PID TTY TIME CMD 2719 pts/2 00:00:00 bash 3503 pts/2 00:00:00 sleep 3504 pts/2 00:00:00 sleep 3505 pts/2 00:00:00 sleep 3506 pts/2 00:00:00 sleep 3508 pts/2 00:00:00 ps [1]+ Terminated ./test.sh $kill 3503 3504 $ps PID TTY TIME CMD 2719 pts/2 00:00:00 bash 3505 pts/2 00:00:00 sleep 3506 pts/2 00:00:00 sleep 3509 pts/2 00:00:00 ps $kill 3505 3506 $ps PID TTY TIME CMD 2719 pts/2 00:00:00 bash 3512 pts/2 00:00:00 ps |
シグナルを指定
(-sオプション等)
killコマンドで送信するシグナルを指定するオプションは、いくつかあります。また、シグナルを指定する方法もいくつかあります。
まず、シグナルを指定するオプションのコマンド例は以下のようになります。
kill -s 15 [process_id]...
kill --signal 15 [process_id]...
kill -15 [process_id]...
そして、シグナルを指定する方法はシグナル番号もしくはシグナル名を用いて指定することができます。以下はすべて同じ動作をするコマンド例です。
kill -s 15 [process_id]...
kill -s TERM [process_id]...
kill -s SIGTERM [process_id]...
kill -TERM [process_id]...
TERMシグナルを送信してもプロセスが終了しない場合、プロセスを強制終了させる方法としてKILL(9)シグナルを送信する方法があります。以下はKILLシグナルを送信してプロセスを終了させる例になります。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$ps PID TTY TIME CMD 2719 pts/2 00:00:00 bash 3581 pts/2 00:00:00 test.sh 3582 pts/2 00:00:00 sleep 3583 pts/2 00:00:00 sleep 3584 pts/2 00:00:00 sleep 3585 pts/2 00:00:00 sleep 3586 pts/2 00:00:00 ps $ $kill -9 3581 $ [1]+ Killed ./test.sh $ps PID TTY TIME CMD 2719 pts/2 00:00:00 bash 3582 pts/2 00:00:00 sleep 3583 pts/2 00:00:00 sleep 3584 pts/2 00:00:00 sleep 3585 pts/2 00:00:00 sleep 3589 pts/2 00:00:00 ps $kill -9 3582 3583 3584 3585 $ps PID TTY TIME CMD 2719 pts/2 00:00:00 bash 3590 pts/2 00:00:00 ps |
ジョブスペックを指定してプロセスを終了
killコマンドはbash組み込みコマンドのjobsコマンドで確認できるジョブスペック(jobspec, job specification)を用いて、プロセスを終了することができます。ジョブスペックは'%n'のような形式で指定を行います。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 |
$jobs [1] Running perl test.pl & [2]- Running python test.py & [3]+ Running bash test.sh & $ $kill %2 $ [2]- Terminated python test.py $jobs [1]- Running perl test.pl & [3]+ Running bash test.sh & |
また、一番最近にCtrl+zでプロセスを停止させたり、プログラムの実行時に'&'の文字を利用して、バックグラウンド処理をさせた場合の処理が現在のジョブになります。
また、'%-'を指定すると前のジョブを参照できます。これはjobsコマンドで確認した場合、数字の後に'-'の記号がついているジョブになります。また、ジョブが一つしか存在しない場合はそのジョブが参照されます。
プロセスグループIDでの終了
killコマンドで指定するプロセスIDが負の値の場合、その指定した値の絶対値のプロセスグループID(PGID)として指定できます。これは多くのプロセスを作成するプログラムを終了するのに利用できます。また、プロセスグループIDを確認するには'ps -j'のコマンドを利用することができます
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ps -j PID PGID SID TTY TIME CMD 2719 2719 2719 pts/2 00:00:00 bash 3624 3624 2719 pts/2 00:00:00 test.sh 3625 3624 2719 pts/2 00:00:00 sleep 3626 3624 2719 pts/2 00:00:00 sleep 3627 3624 2719 pts/2 00:00:00 sleep 3628 3624 2719 pts/2 00:00:00 sleep 3629 3629 2719 pts/2 00:00:00 ps $ $kill -- -3624 $ [1]+ Terminated ./test.sh $ $ps -j PID PGID SID TTY TIME CMD 2719 2719 2719 pts/2 00:00:00 bash 3630 3630 2719 pts/2 00:00:00 ps |
また、指定するプロセスIDが-1の場合は、シグナルを送信する権限を持つすべてのプロセスに対して、シグナルを送信します。
コマンド例
kill -- -3624
または
kill -15 -3624
または
kill -s 15 -3624
コマンド例
ps -j ax
または
ps ax -j
シグナルのリストを表示
(-lオプション)
-lオプションは引数がない状態では、シグナルのリストを表示します。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$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 63) SIGRTMAX-1 64) SIGRTMAX |
シグナル名またはシグナル番号などの引数がある場合、シグナル名ならば対応するシグナル番号を、シグナル番号ならば引数に対応するシグナル名を表示します。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 |
$kill -l 1 HUP $ $kill -l TERM 15 $ $kill -l 1 INT 15 KILL HUP 2 TERM 9 |
参考
GNU Coreutils: kill invocation
Bash Reference Manual: Job Control Builtins