kill - プロセスにシグナルを送信する

スポンサーリンク

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

 

コマンド例と実行結果

 

 

 

シグナルを指定
(-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シグナルを送信してプロセスを終了させる例になります。

コマンド例と実行結果

 

 

 

ジョブスペックを指定してプロセスを終了

killコマンドはbash組み込みコマンドのjobsコマンドで確認できるジョブスペック(jobspec, job specification)を用いて、プロセスを終了することができます。ジョブスペックは'%n'のような形式で指定を行います。

コマンド例と実行結果

 

ジョブスペックの指定方法について、'%'または'%%'または'%+'を用いると現在のジョブを参照することができます。現在のジョブとはjobsコマンドで確認した場合、数字の後に'+'の記号がついているジョブになります。
また、一番最近にCtrl+zでプロセスを停止させたり、プログラムの実行時に'&'の文字を利用して、バックグラウンド処理をさせた場合の処理が現在のジョブになります。
また、'%-'を指定すると前のジョブを参照できます。これはjobsコマンドで確認した場合、数字の後に'-'の記号がついているジョブになります。また、ジョブが一つしか存在しない場合はそのジョブが参照されます。

 

 

 

プロセスグループIDでの終了

killコマンドで指定するプロセスIDが負の値の場合、その指定した値の絶対値のプロセスグループID(PGID)として指定できます。これは多くのプロセスを作成するプログラムを終了するのに利用できます。また、プロセスグループIDを確認するには'ps -j'のコマンドを利用することができます

コマンド例と実行結果

 

指定するプロセスIDが0の場合は、現在プロセスのプロセスグループ内のすべてのプロセスに対して、シグナルが送信します。
また、指定するプロセスIDが-1の場合は、シグナルを送信する権限を持つすべてのプロセスに対して、シグナルを送信します。
負の値のプロセスIDを指定する場合はオプションの終端を示す'--'やシグナルを指定する必要があります。
コマンド例

kill -- -3624

または

kill -15 -3624

または

kill -s 15 -3624
psコマンドにaのオプションとxのオプションを追加すると、全てのプロセスを表示することができます。psコマンドの-jオプションでPGIDを確認する方法と組み合わせると以下のコマンドで全てのプロセスについて確認することができます。
コマンド例

ps -j ax

または

ps ax -j

 

 

 

シグナルのリストを表示
(-lオプション)

-lオプションは引数がない状態では、シグナルのリストを表示します。

コマンド例と実行結果

 

シグナル名またはシグナル番号などの引数がある場合、シグナル名ならば対応するシグナル番号を、シグナル番号ならば引数に対応するシグナル名を表示します。

コマンド例と実行結果

 

 

 

参考

GNU Coreutils: kill invocation

Bash Reference Manual: Job Control Builtins

Man page of SIGNAL