プロセスを強制終了するために、時々killall
コマンドを使用します。私がたまに言うのは、場合によってはうまくいかなかったからです。
最近の例では、メモリ内に約5つのインスタンスがあったThunderbirdを使用したため、killall
コマンドを使用することにしました。 2つのプロセスを強制終了し、3つはまだメモリに残っていました。もう一度試してみたが、3人はまだそこにいた。
そこで、kill -9
コマンドを手動で使用して、pidを介して個々のプロセスをそれぞれ強制終了しました。うまくいきました。
ほとんどの場合、kill -9
コマンドを使用します。 killall
コマンドは何度も私を失望させてしまいました。しかし、それが機能しない理由がなければなりません。間違って使用していますか?
pkill
のような他のコマンドがあることは知っていますが、killall
コマンドが期待どおりに動作しない理由を理解できれば幸いです。私は1つのプロセスだけを殺そうとしましたが、それは当たり前のことです。ただし、kill -9
コマンドは毎回機能します。
何か案は?
PS:Sudo
は違いをもたらさない
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をチェックすると、システムで利用可能なシグナルのリスト全体を取得できます。
次のようなコマンドを検討してください。
kill 2563
これにより、SIGTERMというシグナルがプロセスに送信されます。プロセスが通知を受信すると、いくつかの異なることが起こります。
- プロセスはすぐに停止する場合があります
- リソースをクリーンアップした後、少し遅れてプロセスが停止する場合があります
- プロセスは無期限に実行し続ける可能性があります
SIGTERMを受信すると、アプリケーションは何をしたいかを決定できます。ほとんどのアプリケーションはリソースをクリーンアップして停止しますが、停止しないアプリケーションもあります。 SIGTERMを受信すると、まったく異なる処理を行うようにアプリケーションを構成できます。また、ディスクI/Oの待機など、アプリケーションの状態が悪い場合、送信された信号に基づいて動作できないことがあります。
ほとんどのシステム管理者は通常、アプリケーションがSIGTERMに応答しない場合、より急な信号に頼ります。
kill -9 2563
-9は、シグナル#9を送信することをkillコマンドに通知します。これはSIGKILLと呼ばれます。そのような名前で、この信号がもう少し重要であることは明らかです。
SIGKILLはSIGTERMと同じシグナルヘッダーファイルで定義されていますが、プロセスで無視することはできません。実際、シグナルはカーネル初期化に直接送られるため、プロセスはSIGKILLシグナルを認識しません。その時点で、initはプロセスを停止します。プロセスはシグナルをキャッチしてそれに対処する機会を得ることはありません。
ただし、状況によっては、カーネルがプロセスを正常に終了できない場合があります。プロセスがネットワークまたはディスクI/Oを待機している場合、カーネルはそれを停止できません。ゾンビプロセスおよび無停止のスリープ状態に陥ったプロセスも、カーネルによって停止することはできません。これらのプロセスをシステムからクリアするには、再起動が必要です。
Killall(SIGTERM)をThunderbirdプロセスに送信したとき、それらのプロセスの停止を要求しました。これらのプロセスのいくつかは正しく動作していなかったため(おそらく、そもそもプロセスを強制終了する必要があったのでしょう)、SIGTERMシグナルに対して動作できませんでした。
killall
は、kill
とほとんど同じ構文を受け入れます。特に、killall
をkill -9
と同等にするために凝ったものを書く必要はありません。これはうまく機能します:
killall -9 Thunderbird
(もちろん、議論したように、他の手段が既に成功せずに試みられていない限り、通常killall -9
、または同等にkillall -KILL
を使用することに気が進まないはずです。)