web-dev-qa-db-ja.com

「kill <PID>」は実際にはプロセスを強制終了しません。なぜですか?

コマンドラインのスキルを向上させようとしていますが、プロセスを強制終了できないという問題が発生しました。 kill 2200と入力します。2200は私のPIDで、プロセスは強制終了されません。数分後、topおよびps auxで待機します。私はそれをSudoで入力しようとしました-結果はありません。

なぜそうなるのでしょうか?


編集

fgがプロセスリストを更新する、奇妙な依存関係が見つかりました。

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps
116
Patryk

プロセスはいくつかのシグナルを無視できます。 SIGKILLを送信した場合、それを無視することはできません(また、クリーンアップを行うためにキャッチすることもできません)。試してください:

kill -9 {PID}

詳細については、マニュアルページを参照してください。

man kill
177
Michał Šrajer

killがパラメーターなしで呼び出されると、シグナル番号15(SIGTERM)が送信されます。プロセスはこのシグナルを無視できます。このシグナルは、プロセスをクリーンアップし、自分で正しく終了するようにプロセスに通知します。 それがいい方法です

プロセスが無視できないシグナル番号9(SIGKILL)を「送信」することもできます。カーネルはプロセス自体ではなくプロセスを終了するため、プロセスはそれを認識しません。 それが邪悪な方法です。

kill -9 <pid>は常に機能すると言います。それはmisbeliefです。 kill -9でさえプロセスを強制終了しない場合があります。たとえば、プロセスの状態がD(割り込み不可能なスリープ)である場合。プロセスは、I/Oを待つたびにこの状態になります(通常はそれほど長くありません)。したがって、プロセスがI/Oを待機し(たとえば、障害のあるハードディスク上で)、適切にプログラムされていない場合(タイムアウト付き)、単純にプロセスを強制終了できませんになります。何をするにしても。プロセスを続行するだけでファイルにアクセスできるようにすることができます。

42
chaos

名前はkillですが、実際にはプロセスを強制終了するわけではありませんが、シグナルを送信します。 manページから:

kill - send a signal to a process

kill [pid]によって送信されるデフォルトのシグナルはSIGTERMです。これは通常、プロセスに終了を要求するわけではありません。 SIGTERMシグナルを送信したときに幸せな曲を再生するプログラムを作成することは可能ですが、お勧めしません。

別の一般的なシグナルはSIGHUPです。これは、構成ファイルの再読み取りをプログラムに要求するためによく使用されます。

プログラムを本当に強制終了したい場合は、kill -9 [pid]を実行してSIGKILLシグナルを使用する必要があります。

7
danne

プロセスを一時停止しているようです(おそらく、ターミナルでCtrl-Zを押して)。この状態では、プロセスはフリーズしているためSIGTERMに応答しません。 「fg」を実行するとプロセスが解凍されるため、シグナルを取得して自己終了できます。これにより、「fg」がプロセスリストを更新するように見える理由を説明できます。

2
user24497

C++内から、次を実行しました。

kill(4024, SIGKILL);

そして、linux(Ubuntu)ターミナルでは、

$ ps -ax | grep my_su

出力は次のとおりです。

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

一見、それ(4024)はまだ生き残っています。ただし、上記の「kill」ステートメントを呼び出した親プロセスを終了するとすぐに、4024は表示されなくなりました。今、私は「死んだ」プロセスは表示された行にすぎないと判断し、それを無視することにしました。私の経験がそこにいる誰かを助けることを願っています。乾杯!

0
Park JongBum

また、kill -lを使用して、アーキテクチャでサポートされている信号を表示し、信号を適切に送信するために使用する可能性のある信号について詳しく知ることができます。

注:他の人が述べたように、kill -9 {PID}の使用は、ゾンビプロセスでない限り推奨されません。プロセスがSIGKILLを受信すると、クリーニングまたはその他の適切な手順を実行せずにすぐにシャットダウンします。

0
amrx

これは、ポート80で実行されているlocalhostをピルするために使用したものです(By angular cli)ポート80で実行中のアプリ情報を取得します

Sudo lsof -i tcp:80

After That 
Sudo kill -9 3348

3348は実行中のプロセスのpidです

0
Aklesh Singh