killallはすべてを殺すわけではなく、滅多に殺しません。そのためのコマンドは何ですか?


12

killallプロセスを強制終了するためにコマンドを使用することがあります。私がたまに言うのは、場合によってはうまくいかなかったからです。

最近の例では、メモリ内に約5つのインスタンスが存在するThunderbirdを使用したため、killallコマンドを使用することにしました。2つのプロセスを強制終了し、3つはメモリに残っていました。もう一度試してみましたが、3人はまだそこにいました。

そこで、手動でkill -9コマンドを使用して、pidを介して個々のプロセスをそれぞれ強制終了しました。うまくいきました。

ほとんどの場合、このkill -9コマンドを使用します。このkillallコマンドは何度も私を失望させてしまいました。しかし、それが機能しない理由がなければなりません。間違って使用していますか?

他にも同様のコマンドがあることは知っていますpkillが、killallコマンドが期待どおりに機能しない理由を理解できれば幸いです。私は1つのプロセスだけを殺そうとしましたが、それは当たり前のことです。しかし、kill -9コマンドは毎回機能します。

何か案は?

PS:sudo違いはありません

回答:


22

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シグナルに対して動作できませんでした。


サンダーバードのインスタンスの一部のみを殺した理由についての推測はありますか?
ミーアボルグ

@Doogfar編集した記事(またはリンクしたページ)を参照してください
-tgm4883

おかげで、なぜ私のサンダーバードが壊れたのか、-9を殺すのが過酷だった理由についても説明します
Meer Borg

それでも常に機能するとは限りません。
クレイグヒックス

4

killallと同じ構文のほとんどを受け入れますkill。特に、にkillall相当するものを作成するために派手な何かを記述する必要はありませんkill -9。これはうまく機能します:

killall -9 thunderbird

(もちろん、説明したように、他の手段がすでに成功せずに試行されていない限りkillall -9、通常は使用することを嫌がるか、同等に使用する必要がありkillall -KILLます。)


それでも常に機能するわけではないので、何か他のものがあるはずです。
クレイグヒックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.