Ctrl + Cでプロセスを強制終了できない場合はどうすればよいですか?


171

Ctrl+ Cは、現在のプロセスを強制終了するために常に機能するとは限りません(たとえば、特定のネットワーク操作でそのプロセスがビジーである場合)。その場合、カーソルで「^ C」と表示されるだけで、他のことはできません。

端末を失うことなく、そのプロセスを強制終了させる最も簡単な方法は何ですか?

回答の要約: 通常、プロセスをスリープ状態にするためにCtrl+ Zを実行し、その後kill -9 _process-pid_psや他のツールを使用してプロセスのpidを見つけることができます。上バッシュ(そしておそらく他のシェル)、あなたが行うことができますkill -9 %1簡単です(一般または「%N」)を。Ctrl+ Zが機能しない場合は、別のターミナルを開いてそこから強制終了する必要があります。


screen新しいウィンドウとkillそこからプロセスを作成できるようにする、可能な解決策になります。
ボビー

2
すでにスクリーンにいると仮定してください:)
ダスティンボズウェル

回答:


119

Ctrl+ Cが機能しない理由の問題を理解するには、それを押したときに何が起こるかを理解することが非常に役立ちます。

ほとんどのシェルは、「フォアグラウンドで現在実行されているプログラムにSIGINTシグナルを送信する」ためにCtrl+ Cをバインドします。manシグナルを介してさまざまなシグナルについて読むことができます:

 SIGINT        2       Term    Interrupt from keyboard

プログラムはSIGTSTPも無視できるため、そのシグナルを無視できます。

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(これはほとんどのシェルがCtrl+ を押したときに何をするかですZ。これが動作することが保証されない理由です。)

プロセスによって無視できないシグナルがいくつかあります:SIGKILLSIGSTOPおよびその他のシグナル。これらのシグナルは、killコマンドを介して送信できます。したがって、ハング/ゾンビ化するプロセスを強制終了するには、プロセスID(PID)を見つけるだけです。たとえば、pgreporまたはpsandを使用しますkill

 % kill -9 PID

13
単なる発言。「ゾンビ」は技術的にはプロセス状態であり、「ゾンビ化」によってここで意味したものとは異なることに注意してください。(その親によってwait()-edされていない終了したプロセスは、ゾンビ(Z)状態にあります。この場合、シグナルを処理できなくなります。)
StéphaneGimenez

悲しいかな、時々ctrl + c、ctrl + z、およびctrl + \はすべて何もせず、プロセスはundo sudo(パスワードなしで許可)を実行しているため、プロセスにシグナルを送信することはできません。
マイケル

112

Ctrl+ C(SIGINT)が機能しない場合は、Ctrl+ \(SIGQUIT)を試してください。次に、Ctrl+ Z(SIGTSTP)を試してください。シェルプロンプトに戻る場合killは、プロセスIDを実行します。(あなたが指定することができSIGTERM信号にこのデフォルトは、kill -TERM。一部のシェルでは、あなたが使用することができるかもしれ%1PIDを参照すること。)問題が解決しない場合は、別の端末またはSSHセッションに移動して行うkillkill -TERMについてプロセスID。 最後の手段としてのみkill -KILL、別名を実行する必要があります。kill -9プロセスにクリーンなアボート、開いているファイルの同期、一時ファイルの削除、ネットワーク接続のクローズなどの機会を与えないためです。


32

Ctrl-Zを押してプログラム中断し、バックグラウンドに配置します

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(を使用して再び前景に復元しますfg

次に、プロセスIDを指定して(killまたはkill -9から取得ps a)できます。


13
bashを使用すると、最後のバックグラウンドプログラムのpidを含む特別な変数kill $!と同様$!に、できます。
-Lloeki

@Lloekiは私には機能しません(少なくとも信頼できません)。bg変数に値が割り当てられる前に、1回行う必要があります。
ダニエルベック

2
@ダニエル、正しい。私が最後のバックグラウンドプロセスと言ったようにbg、Ctrl + Zの直後に必要なのは単に中断されているだけです。
-Lloeki

2
注:これは単なるトリックではなく、同じ名前の複数のプロセスを実行している場合、ps出力(またはkillall)を使用することは非常に危険です。ps -e -o pid,commandプログラム名だけでなくpid + full argsを提供しますが、これでも識別するには十分ではない可能性があります。対照的に$!確かにヒットです。
-Lloeki

1
@Lloeki私は同意しません。ps a私のシステムからの出力行の例:同じtty()で実行している同じコマンド()の27721 s000 T 0:00.09 topサスペンド(T、私が思う)インスタンスはtopいくつありますs000か?
ダニエルベック

30

このリンクも参照してください。

Ctrl+ Z:プロセスを一時停止します。

Ctrl+ C:プロセスを今すぐシャットダウンするよう丁寧に依頼します。

Ctrl+ \:現在フォアグラウンドにあるプロセスを容赦なく殺す


"ctrl"+ "\"
役に立た

13

通常、プロセスを停止(Ctrl+ Z)してからを使用できますkill -9。以下のためにkill -9、あなたが必要とするプロセスのPIDを最初に。バックグラウンドジョブの場合、kill -9 %1これを行う最も簡単な方法です。強制終了するバックグラウンドジョブの数がわからない場合は、実行しjobsます。

または、プロセスIDを見つけることができます

ps

その後、実行することができます

kill -9 <Appropriate PID from ps output>

5

Bash(および他のシェル?)のより簡単な解決策は次のとおりです。

Ctrl-z      followed by     kill -9 %1

ここで、「%1」は強制終了されるジョブ番号を指します。すでに他のジョブがスリープしている場合、「%2」(または他の何か)になる可能性があります。Ctrl-zを押すと、ジョブ番号がわかります。

[1]+  Stopped                 <process name>

「kill」はシェルのバージョンのkillであり、/ bin / killではないことに注意してください。


4

1)コンソール上でマルチユーザーモードの場合、CTRL-ALT-Fnを押して別の画面にログインし、ps -ef | grep <myprocessname>or pidof <myprocessname>を使用して、ID番号でプロセスを強制終了します。

2)リモートで接続している場合は、別の端末セッションを介して同じことを行います。

また、実行中のプロセスを選択的に強制終了することができるtopのより用途の広いバージョンであるhtopをインストールすることで、生活を少し楽にすることもできます。ほとんどのディストリビューションのリポジトリにはhtopがあります。

3)ハングしたsshセッション(他のシステムなど)で立ち往生している場合、エスケープキーであるチルダ(〜)を押してから、Ctrlキーを押しながらZキーを押してホストセッションに戻ります。スタックしているsshプロセスを強制終了するか、タイムアウトになるまで待つことができます。これは、ほとんどの場合、一定の非アクティブ期間の後に行われます。


0

tmuxまたはscreenを使用していて、上記のいずれも機能しない場合、までにペインを強制終了できますが<prefix> x、プロセスも強制終了されます。


0

/ etc / profileにSIGINT(2)で設定されたトラップがあるかもしれません。その場合は、削除します。ログアウトしてからログインし直してください。

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