-9プログラムを殺すが、彼らはまだつかまります


11

私は以前にKUbuntuの下で送信したバックグラウンドジョブをすべて殺そうとしました

kill -9 $(jobs -p)

このコマンドはすぐに次のようなメッセージを出しましたが

[1] myjob1を殺した

[2] myjob2を殺した

topの出力でそれらのプロセスがハングしているのをまだ確認できます。CPUとメモリの使用量は、uptimeとfreeの出力で変更されていません。

だから私は彼らをきちんと殺していないに違いないと思います。誰かが私に何が起こっているのか、そして私は何をすべきかを説明できますか?

トップでkと入力してPIDを入力すると、プロセスを1つずつ強制終了できることがわかりました。これはコマンドkillとは異なりますか?

kill -9を推奨しないことについて、オンラインhttp://www.ruhr.de/home/smallo/award.htmlのどこかでも見つけました

キル-9の無用な使用フォームレター

(引用嫌悪)

ダメダメダメ。kill -9は使用しないでください。

プロセスにクリーンな機会を与えるものではありません。

1)ソケット接続をシャットダウンする

2)一時ファイルをクリーンアップする

3)それがなくなることを子供に知らせる

4)端末特性をリセットする

などなど。

通常、15を送信し、1〜2秒待って、それが機能しない場合は2を送信し、それが機能しない場合は1を送信します。それでも機能しない場合は、プログラムが正しく動作しないため、バイナリを削除してください。

kill -9は使用しないでください。植木鉢を片付けるためだけにコンバインを持ち出さないでください。

これは本当ですか?「send 15」、「send 2」、「send 1」とはどういう意味ですか?彼らはそれ自体をコマンドですか、それとも「kill -15 PID」、「kill -2 PID」、「kill -1 PID」ですか?

よろしくお願いします!


バイナリ(実行可能ファイル)を削除しても、プロセス自体は強制終了されません。ファイルシステムは、プロセスがそのファイルを使用していることを認識し、ファイルを削除した後でもプロセスにファイルを「参照」させます。
Jeppe Stig Nielsen

回答:


9

プロセスはおそらく停止していますが、「ゾンビプロセス」であるため、プロセステーブルエントリに表示されます。子プロセスが終了して完全に消えたとき(そのプロセステーブルエントリを除く)、親がその終了ステータスを(任意の待機関数を介して)フェッチできない場合、それはゾンビと呼ばれます。すでに終了しているので動作します。あなたがする必要があるのは、その親プロセスを見つけて、1つのクリーンなものを殺すことです、したがってkill-9を使用しません

ゾンビを倒すための簡単な2つの手順を次に示します...

  1. 親がまだ生きている場合は、殺してみてください(またはSIGHUPで十分です)
  2. 番号1が失敗した場合、カーネルにバグがあります...リブートはあなたの友人であり、そのバグを修正します:->

コマンドラインとバックグラウンドでジョブを送信します。親はどうなりますか?そして、もしあれば、どうすれば彼らの両親を見つけることができますか?
ティム

-f親プロセスを表示するには、psにフラグを使用します。
ジャックM.

6

man kill利用可能なさまざまな信号の定義についてはを参照してください。ただし、そうです。

  • 15はSIGTERMであり、プログラムに終了するように要求します。
  • 2はSIGINTで、Control-Cと同等です。
  • 1はSIGHUPであり、端末がハングアップしたことを示します。

これらは、ユーザーにプロセスが「完了」したことをプロセスに通知しますが、多少異なる理由を示しています。SIGTERMは、「現在のタスクを終了し、その後終了します。別のタスクを開始しないでください」と解釈される場合があります。SIGINTは、 「実行して終了」、SIGHUPは、もはや誰もリッスンしていないことを意味します(サーバープロセスは、コンソール出力を中止して実行を継続することにより、SIGHUPに合法的に反応する可能性があります)。

  • 9はSIGKILLであり、プロセスが内部でキャッチして処理できない唯一のSIGKILLです。カーネルがプロセスの制御を返すことはなく、クリーンアップする機会がありません。

一番上で、kと入力してPIDを入力すると、プロセスを1つずつ強制終了できます。これは、killコマンドのいくつかのオプションと同等ですか?
ティム

はい、topはkillと同じようにプロセスにシグナルを送信します。AFAICT、topが使用するデフォルトの信号は15(SIGTERM)です。
puetzk


1

「kill -9」ではなく、「kill -1」または「kill -15」と入力します。Kill -9は、実行中のプロセスの先頭にあるハードコアの弾丸であり、ダーティな状態でそれを強制終了し、メモリリークを引き起こす可能性があります。

kill -9と入力していて機能しない場合は、プロセスが再生成されていないことと、そのプロセスを強制終了する権限があることを確認します。


プロセスが再生成されていないことを確認するには、どのように見えますか?プロセスを所有しているので、そのプロセスを強制終了する権限はありますか?
Tim

異なる場合は、別のプロセス番号が必要です。したがって、ps -Alを実行し、processAが表示された場合は、-9 processAを強制終了してから、ps -Alを実行し、プロセスキューにまだprocessAがある場合は、それが同じprocessAであって、新しいprocessAであることを確認してください。
Satanicpuppy

また、プロセスを強制終了する権限がない場合にも通知されます。
Satanicpuppy

0

シグナル9はSIGKILLです。SIGKILLを送信すると、OSはすぐにプロセスを強制終了するよう求められ、質問はされません。プロセスは事前に通知されず、それ自体をクリーンアップする機会がありません。

シグナル15はSIGTERMです。SIGTERMを送信すると、OSにプロセス自体をシャットダウンするように依頼することになります。

プロセスがIOを実行しているとOSが考えている場合、またはゾンビ(親がその後クリーンアップしなかった子プロセス)である場合、SIGKILLは無視されます。

SIGTERMはアプリケーションによって無視される可能性がありますが、OSがシャットダウン中にSIGTERMを送信し、プログラムがまだ実行されている場合はすぐにSIGKILLが続くため、アプリケーションがこれを行うことはお勧めできません。

注:コマンドラインkillは常に、OSにアプリケーションに信号を送信するように要求しています。これは、プロセスの所有者などに基づいて行う場合とそうでない場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.