kill
kill
(キル)は、UNIXやUnix系のオペレーティングシステムにおいて、システム上で動作しているプロセスに簡単なメッセージを送るコマンドである。
概説
[編集]デフォルトで送るメッセージは、終了(termination)シグナルであり、プロセスに終了(exit)することを要求する。しかし、killは少し誤った名称である。送られるシグナルは、プロセスの終了とは無関係の場合がある。kill
コマンドは
kill()
システムコールのラッパーであり、数字のプロセス識別子(PID)で指示されたプロセスや、プロセスグループ識別子(PGID)で指示されたプロセスグループに、シグナルを送る。kill
は昔からスタンドアロンのユーティリティとして提供されているが、多くのシェルはわずかに異なるビルトインのkill
コマンドを持っている。
ユーザが通常最も利用するシグナルはSIGTERMとSIGKILLであるが、kill
は多くの異なるシグナルを送ることも可能である(シグナル全体のリストはシグナルを参照)。デフォルトで送られるシグナルはSIGTERMである。このシグナルを扱うプログラムは、プログラムを終了する前に、役に立つクリーンアップの処理(構成情報をファイルに保存するなど)を行うことが出来る。しかし、多くのプログラムはこのシグナルに対して特別なハンドラを実装しておらず、デフォルトシグナルハンドラが代わりに呼ばれる。時には、特別なハンドラを持つプロセスでさえ、シグナルを正しく処理していないことがある。
SIGKILLとSIGSTOP以外の全てのシグナルは、プロセスによって横取りすることが出来る。これは、プログラムがシグナルを受信したときに、特別な関数を呼び出せることを意味している。二つの例外のSIGKILLとSIGSTOPは、ホストシステムのカーネルだけが処理を行い、プロセス実行のコントロールについて信頼できる方法を提供している。SIGKILLはプロセスを終了させる。SIGSTOPは、SIGCONTを受けるまでの間、プロセスを中断させる。
UNIXは、権限のないユーザが他のプロセスを終了させることを防止するため、セキュリティの機構を提供している。基本的には、あるプロセスが別のプロセスにシグナルを送るとき、シグナルを送るプロセスの所有者は、シグナルを受けるプロセスの所有者と同じか、スーパーユーザーであることが求められる。
利用可能なシグナルは全て異なる名前を持ち、特定の数字にマッピングされている。UNIXの実装によって、数字とシグナルのマッピングが異なることに注意する必要がある。SIGTERMは多くの場合15であり、SIGKILLは多くの場合9である。
例
[編集]プロセスに対して以下の3つの方法でSIGTERMシグナルを送ることができる(この場合はプロセスIDは'1234' である):
kill 1234
kill -TERM 1234
kill -15 1234
また、プロセスに対して以下の2つの方法でSIGKILLシグナルを送ることができる:
kill -KILL 1234
kill -9 1234
他の有用なシグナルには、HUP、TRAP、INT、ALRM等がある。SIGINTシグナルは、多くのシェルで、単純にCTRL+Cを押すことで発生させることができる。一般的に、CTRL+ZがSIGTSTPに、 CTRL+\ (バックスラッシュ) がSIGQUITに割り当てられている。SIGQUITはプログラムにコアダンプを行わせることが出来る。
関連するプログラム
[編集]- killall - Solaris等のいくつかのUNIX系OSでは、システムのシャットダウンの過程でこのユーティリティが自動的に起動される。これは、上記のkillコマンドのような働きを行うが、特定のプロセスにシグナルを送るのではなく、システムの全てのプロセスにシグナルを送る。しかし、IRIX・Linux・FreeBSDのような他のシステムでは、終了させるプロセスの名前を指定するためのパラメータを使用する。例えば、xmmsによって起動されたXMMS音楽プレーヤを終了させるために、
killall xmms
というコマンドが使用される。これはxmms
という名前の全てのプロセスを終了させる。 - pkill - これは、名前や他の属性に基づいて、プロセスにシグナルを送る。Solaris 7で導入され、LinuxとOpenBSDで再実装された。pkillは、終了させるプロセスをより便利な名前を基準に指定できる。例えば、pkillを使用せずに(また、pgrepも使用せずに)、firefoxという名前のプロセスを終了させる場合は、
kill `ps -ax | grep firefox | grep -v grep | awk '{print $1}'`
をタイプする必要がある。pkillが使用できる場合は、単純にpkill firefox
とタイプするだけよい。
Windows
[編集]Microsoft Windows XPとMicrosoft Windows Vistaには、プロセスを終了させるためのtaskkillコマンド[1]がある。また、非サポート版のkillが、Windows NT 3.x, NT 4.0, Windows 2000, Microsoft Windows Server 2003向けのMicrosoft Windows Resource Kits(または"RezKits")に含まれていた。バージョン3.5のkill(Copyright (C) 1994 Microsoft Corp.)が最も有用であった。GNUバージョンのkillは、Cygwinによって移植され、Microsoft Windows Services for UNIX[2]が提供するUNIX OSレイヤ中で動作した。(マイクロソフトは1999年9月17日に、Softway Systems社と同社のInterix製品を買収することで、Microsoft Windows Services for UNIXを手に入れた。)
killは、Win32の世界のスレッドと実行形式の個別の管理に、待望された粒度を提供した。しかし実質的には、どのkillの派生版も(POSIXの世界から移植されたものも、模倣したりスクラッチから作られたものも)、競合するUnixのような、実行中のウィンドウズのプロセスに対する完全な機能がなく、根本的な制御が行えなかった。
Plan 9
[編集]Plan 9において、killプログラムは実際には終了の動作をせず、プロセスIDも使用しない。むしろ、プロセスの実際の名前を使用し、プロセスを終了させるために、Plan 9のシェルであるrcに対するコマンドを出力する。例えば、実行中のtroffを全て終了させるときは、以下のようにタイプする。
kill troff | rc
slayと呼ばれる類似のコマンドが提供されている。この方法で終了されることを拒否するプロセス以外に対しては同じ動作である。