
私は時々、killall
プロセスを強制終了するコマンドを使用します。時々と言うのは、場合によってはそれが機能しなかったからです。
最近の例では、Thunderbird でメモリ内に約 5 つのインスタンスがあったので、killall
コマンドを使用することにしました。2 つのプロセスが終了しましたが、3 つはまだメモリ内に残っていました。もう一度試しても、3 つはまだ残っていました。
そこで、私は手動でkill -9
コマンドを使用して、各プロセスの pid を介して個々のプロセスを強制終了しました。これはうまくいきました。
kill -9
私は、このコマンドを、機能するものとしてほとんど使用しています。このkillall
コマンドは、何度も私を失望させたので、使用しなくなりました。しかし、機能しないのには理由があるはずです。私は間違って使用していますか?
他にも同様のコマンドがあることは知っていますpkill
が、コマンドが期待どおりに動作しない理由を教えていただければ幸いですkillall
。 1 つのプロセスだけを終了しようとしましたが、うまくいかないこともあります。 しかし、このkill -9
コマンドは毎回動作します。
何か案は?
追記:sudo
違いはありません
答え1
killallのマニュアルページより
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 は、kill コマンドに、SIGKILL と呼ばれるシグナル #9 を送信するように指示します。このような名前から、このシグナルが少し重みを持つのは明らかです。
SIGKILL は SIGTERM と同じシグナル ヘッダー ファイルで定義されていますが、プロセスでは無視できません。実際、シグナルはカーネル init に直接送信されるため、プロセスは SIGKILL シグナルを認識しません。その時点で、init はプロセスを停止します。プロセスはシグナルをキャッチしてそれに応じて動作する機会を得ることはありません。
ただし、状況によっては、カーネルがプロセスを正常に終了できない場合があります。プロセスがネットワークまたはディスク I/O を待機している場合、カーネルはそれを停止できません。ゾンビ プロセスや割り込み不可能なスリープ状態にあるプロセスも、カーネルでは停止できません。これらのプロセスをシステムからクリアするには、再起動が必要です。
Thunderbird プロセスに killall (SIGTERM) を送信したとき、それらのプロセスを停止するように要求しました。それらのプロセスの一部は正常に動作していなかったため (おそらく最初にそれらを kill する必要があった理由です)、SIGTERM シグナルに応答できませんでした。
答え2
killall
は とほぼ同じ構文を受け入れます。特に、と同等の機能をkill
実行するために特別なことを記述する必要はありません。これは問題なく動作します:killall
kill -9
killall -9 thunderbird
(もちろん、すでに説明したように、他の手段がすでに試されて成功していない場合を除き、通常killall -9
は または、同等のを使用することは控えるべきです。)killall -KILL
答え3
すぐに答えが欲しい人のために:
sudo killall -s SIGTERM processname