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


118

コマンドラインスキルを向上させようとしていますが、プロセスを強制終了できないという問題が発生しました。私はタイプkill 22002200が私のPIDであり、プロセスが殺されていないところ。数分後に待機がまだあるtopps 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

それはどんなプロセスでしたか?プロセスが機能していないかどうかを確認しましか?その場合、親プロセスを強制終了する必要があります。
htorque

プロセスはtop(編集にリストされているとおり)です。プログラムをバックグラウンドで動作させてから戻したいと思っていました。
パトリク

2
あなたはCTRL-Zとのプロセスを中断した場合、それがサスペンドだとして、それは限り、ほとんどのシグナルをブロックします(つまり、あなたがやるまでfgまたはbgプロセス用)
番号

回答:


179

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

kill -9 {PID}

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

man kill

22
また、非常に特殊な状況では、プロセスがゾンビ/無効な状態になり、SIGKILLでさえプロセスを強制終了できないことにも注意してください。その場合、親プロセスを見つけて親プロセスを強制終了する必要があります。
ライライアン

15
そのプロセスがステップアウトする場合、それはキルダッシュナインです!
スコット

4
また、親プロセスが存在しない場合もありますが、その場合は単にめちゃくちゃになります。このようなプロセスを削除する唯一の方法は、マシンを再起動することです。
user606723

2
killコマンドの名前は、多くのユーザーにとって誤解を招くものです(最初は私も含めて)。「Xを殺す」と言うとき、これは本当にXを殺すことを意味し、他のことはしないということを前提としています。私はこれが物事を変えることはないことを理解していますが、彼らがより精巧な名前を選んだことを望みます
...-rbaleksandar

1
後でも何がkill -9機能せず、プロセスがまだ動き回っていますか?
ダグラスガスケル

42

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

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

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


2
これは非常に役立ちます。ネットワークディスクでI / Oアクセスがハングしているため、これを何度か経験しましたが、凍結したプロセスを強制終了できなかったのはなぜだろうと思いました。この特定の問題に関する詳細なドキュメントとその回避方法はありますか?
シェルジョン14

7

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

kill - send a signal to a process

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

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

あなたは本当にあなたが使用する必要があるプログラム殺したい場合はSIGKILLを行うことにより、信号をkill -9 [pid]


2

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


1
では、接続された端末を見つける方法は?
-ruX

0

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

kill(4024, SIGKILL);

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

$ ps -ax | grep my_su

出力は次のとおりです。

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

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


0

また、使用kill -lしているアーキテクチャでサポートされている信号を表示するために使用したり、信号を適切に送信するために使用したい信号の詳細を学ぶことができます。

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


0

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

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

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

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