名前

kill - プロセスを終了する

書式

kill [-signal|-s signal|-p] [-q value] [-a] [--timeout milliseconds signal] [--] pid|name...

kill -l [number] | -L

説明

コマンド kill は、 指定されたプロセスまたはプロセスグループに対して、 指定された signal を送信する。

シグナルが指定されなかった場合は、 TERM シグナルが送信される。 このシグナルのデフォルト動作は、 対象プロセスを終了させることである。 KILL シグナル (番号 9) よりも、 このシグナルを用いることが望ましい。 なぜならプロセスの中には、 TERM シグナルを受けるハンドラーをインストールしているものがあり、 クリーン処理を行ってから順に終了処理を行うようにしている場合があるからである。 TERM シグナルを送信しても、 そのプロセスが終了しなかった場合、 KILL シグナルを用いることになるかもしれない。 KILL シグナルは、 捕らえることができない点に注意が必要である。 つまり、 対象プロセスを終了させる前に、 そのプロセスのクリーンアップ処理を実行する機会は得られない、 ということである。

最近のシェルには、 ビルトインの kill コマンドがある。 その使用方法は、 ここに説明しているコマンドと、 だいたい同じである。 --all--pid--queue の各オプションや、 コマンド名からプロセスを指定する方法は、 独自の拡張機能である。

signal に 0 が指定された場合、 実際にシグナルは送信されない。 ただし、 エラーチェック処理は実行される。

引数

シグナルを受けるプロセスのリストでは、 プロセス名と ID を混ぜて指定することができる。

pid

pid は、 次のいずれかにより説明できる。

n

n は 0 よりも大きな値である。 PID n を持つプロセスにシグナルが送られる。

0

現在のプロセスグループに属するプロセスすべてにシグナルが送られる。

-1

PID が 1 よりも大きなプロセスすべてにシグナルが送られる。

-n

この n は 1 よりも大きな値である。 これによって、 プロセスグループ n に属するプロセスすべてにシグナルが送られる。 '-n' の形で引数を指定し、 それがプロセスグループを意図しているのであれば、 シグナルを先に指定しておくか、 あるいは引数の前に '--' オプションを指定しておく必要がある。 そのようにしなかった場合は、 この引数が、 送信するシグナルとして解釈される。

name

この name を使って起動されたプロセスすべてにシグナルが送られる。

オプション

-s, --signal signal

送信するシグナルを指定する。 これは名前または番号で指定できる。

-l, --list [number]

シグナル名の一覧を表示する。 または、 指定されたシグナル番号をシグナル名に置き換えて表示する。 シグナルは /usr/include/linux/signal.h により確認することができる。

-L, --table

-l と同様。 ただしシグナル名と対応番号をともに表示する。

-a, --all

現在のプロセスと同一 PID を持つプロセスに対して、 コマンド名から PID への変換を制限しない。

-p, --pid

指定されたプロセスの ID (PID) のみを表示する。 シグナルは送信しない。

--verbose

kill によってシグナルが送信される PID を表示する。

-q, --queue value

kill(2) ではなく、 sigqueue(3) を使ってシグナルを送信する。 引数 value は整数値であり、 シグナルとともに送信される。 シグナルを受信するプロセスが、 sigaction(2) に対するフラグ SA_SIGINFO を利用して、 このシグナルを処理するハンドラーをインストールしている場合、 siginfo_t 構造体の si_sigval フィールドから、 そのデータが取得される。

--timeout milliseconds signal

通常どおり、 プロセスに対して定められたシグナルを送信した後に、 指定された時間が経過してから、 追加のシグナルを送信する。 --timeout オプションは、 kill に対して、 プロセスへの追加 シグナル 送信前に、ミリ秒 単位で指定された時間だけ待機することを指示する。 この機能は、 Linux カーネルの PID ファイルディスクリプター機能を用いて実装されている。 このことから、 後続のシグナルは同一シグナルへ送信され、 またプロセスが存在しなくなったらシグナルが送信されない、ということが保証される。

オペレーティングシステムは、 PID を再利用することがある点に注意すること。 上に示した機能を、 シェル内において killsleep を使って実現したとすると、 競合が発生する可能性がある。 その場合、 リサイクルによって PID が割り当てられた、 別のプロセスに後続のシグナルが送信されることがある。

--timeout オプションは、 複数指定することが可能である。その場合、 指定された時間間隔で、 順にシグナルが送信される。 --timeout オプションは、 --queue オプションと組み合わせて利用することができる。

例として以下のコマンドは、 シグナル QUITTERMKILL を順に送信する。 そのシグナル送信の合間は、 1000 ミリ秒待機する。

kill --verbose --timeout 1000 TERM --timeout 1000 KILL \
        --signal QUIT 12345

終了ステータス

kill には、終了ステータスとして以下がある。

0

成功。

1

失敗。

64

部分的に成功 (複数プロセス指定時)。

注意

kill の引数として、 マルチスレッドのうちの 1 スレッドを表す TID (thread ID, スレッド ID) を指定することは可能である。 ただし、 シグナルはそのスレッド (つまりスレッドグループ全体) に送信される。 言い換えると、 マルチスレッドプロセス内のスレッドを、 明示的に指定するシグナル送信はできない、 ということである。 そのシグナルは、 スレッドの中で、 シグナル受信を拒否していないものであれば、 対象プロセス内の任意に選び出されたスレッドに対して送信される。 詳しくは signal(7) や、 clone(2) 内の CLONE_THREAD の説明を参照のこと。

さまざまなシェルにおいては、 ビルトインの kill コマンドが提供されていて、 本マニュアルが説明する kill(1) コマンドに比べて、 そちらが採用されている。 ここで説明しているコマンドを確実に実行するには、 コマンド実行の際に、 フルパスを指定するのが簡単である。 つまり、 /bin/kill --version とすればよい。

作者

元のバージョンは BSD 4.4 から取り込まれた。

関連項目

bash(1), tcsh(1), sigaction(2), kill(2), sigqueue(3), signal(7)

バグ報告

バグ報告は、 以下にある issue トラッカーを利用すること。 <https://github.com/util-linux/util-linux/issues>.

入手方法

kill コマンドは util-linux パッケージの一部であり、 以下からダウンロードできる。 Linux Kernel Archive <https://www.kernel.org/pub/linux/utils/util-linux/>.