killallのmanページから
killallは、指定されたコマンドのいずれかを実行しているすべてのプロセスにシグナルを送信します。シグナル名が指定されていない場合、SIGTERMが送信されます。
を実行するkill -9
と、SIGKILLシグナルが送信されます。killallを使用してSIGKILLを送信する場合は、次を実行する必要があります。
killall -s SIGKILL <PROCESSNAME>
SIGKILLとSIGTERMの違いについての適切な説明(およびSIGTERMを最初に試す必要がある理由)
http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/から
Unixシステムでkillを使用してプロセスにシグナルを送信することは、ほとんどのシステム管理者にとって新しいトピックではありませんが、killとkill -9の違いについて何度も尋ねられました。
プロセスでkillを使用するときはいつでも、実際にプロセスにシグナルを送信しています(ほとんどすべての状況で-すぐにそれについて説明します)。標準Cアプリケーションには、特定のシグナルを受信した場合にプロセスが従うべきステップを含むヘッダーファイルがあります。killのmanページをチェックすることにより、システムで利用可能なシグナルのリスト全体を取得できます。
次のようなコマンドを検討してください。
kill 2563
これにより、SIGTERMというシグナルがプロセスに送信されます。プロセスが通知を受信すると、いくつかの異なることが起こります。
- プロセスはすぐに停止する場合があります
- リソースをクリーンアップした後、少し遅れてプロセスが停止する場合があります
- プロセスが無期限に実行し続ける場合があります
SIGTERMを受信すると、アプリケーションは何をしたいかを決定できます。ほとんどのアプリケーションはリソースをクリーンアップして停止しますが、停止しないアプリケーションもあります。SIGTERMを受信すると、まったく異なる処理を行うようにアプリケーションを構成できます。また、アプリケーションがディスクI / Oの待機などの悪い状態にある場合、送信された信号に基づいて動作できない場合があります。
ほとんどのシステム管理者は通常、アプリケーションがSIGTERMに応答しない場合、より突然のシグナルに頼ります。
kill -9 2563
-9は、シグナル#9を送信することをkillコマンドに伝えます。これはSIGKILLと呼ばれます。そのような名前で、この信号がもう少し重要であることは明らかです。
SIGKILLはSIGTERMと同じシグナルヘッダーファイルで定義されていますが、プロセスで無視することはできません。実際、シグナルはカーネル初期化に直接送られるため、プロセスはSIGKILLシグナルを認識しません。その時点で、initはプロセスを停止します。プロセスはシグナルをキャッチしてそれに対処する機会を得ることはありません。
ただし、状況によっては、カーネルがプロセスを正常に終了できない場合があります。プロセスがネットワークまたはディスクI / Oを待機している場合、カーネルはそれを停止できません。ゾンビプロセスと、割り込み不能なスリープ状態に陥ったプロセスも、カーネルによって停止することはできません。これらのプロセスをシステムからクリアするには、再起動が必要です。
サンダーバードプロセスにkillall(SIGTERM)を送信したときに、それらのプロセスの停止を要求しました。これらのプロセスの一部は正しく動作していなかったため(おそらく、そもそもプロセスを強制終了する必要があったのでしょう)、SIGTERMシグナルに対して動作できませんでした。