web-dev-qa-db-ja.com

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

Ctrl + C 現在のプロセスを強制終了するように常に動作するわけではありません(たとえば、特定のネットワーク操作でそのプロセスがビジー状態の場合)。その場合は、カーソルのそばに "^ C"が表示されるだけで、それ以外のことはできません。

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

答えのまとめ:通常は、できます Ctrl + Z プロセスをスリープ状態にしてからkill -9 _process-pid_を実行します。ここで、 ps とその他のツールを使用してプロセスのpidを見つけます。 Bash (そしておそらく他のシェル)では、kill -9 %1(あるいは一般的に '%N')を実行することができます。もし Ctrl + Z 動作しません、あなたは別の端末を開いてそこからkillしなければなりません。

168
Dustin Boswell

その理由を理解する Ctrl + C 動作しません、それを押すと何が起こるかを理解することは非常に役に立ちます。

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

 SIGINT        2       Term    Interrupt from keyboard

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

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(これはあなたが押すとほとんどのシェルがすることです Ctrl + Zだからこそ、動作が保証されていないのです。

このプロセスで無視できないシグナルがいくつかあります。 SIGKILLSIGSTOP などです。これらのシグナルは kill コマンドで送ることができます。だから、あなたのぶら下がっている/ゾンビをやっているプロセスを殺すために、ちょうど プロセスID (PID)を見つけてください。たとえば、pgrepまたはpsを使用してからkillを使用します。

 % kill -9 PID
115
akira

もし Ctrl+C (SIGINT)は動作しません、試してください Ctrl+\ (SIGQUIT)それから試してみてください Ctrl+Z (SIGTSTP)これでシェルプロンプトに戻る場合は、プロセスIDに対してkillを実行してください。 (これはデフォルトでSIGTERMシグナルになります。これはkill -TERMで指定できます。シェルによっては、PIDを参照するために%1を使用できる場合があります。)それでもうまくいかない場合は、別の端末またはSSHセッションに移動してkillを実行してください。またはプロセスIDのkill -TERM最後の手段としてkill -KILL、a.k.a. kill -9を実行すべきです、なぜならそれはプロセスがきれいに打ち切ったり、開いているファイルを同期したり、一時ファイルを削除したり、ネットワーク接続を閉じたりする機会を与えないからです。

110
Teddy

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から取得できます)。

30
Daniel Beck

こちらの link もご覧ください。

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

Ctrl+C:丁寧にプロセスを停止するように依頼してください。

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

28
RoboAlex

通常は、まだプロセスを停止できます(Ctrl + Zその後、kill -9を使用します。 kill -9の場合、最初に process PID が必要です。バックグラウンドジョブの場合、kill -9 %1が最も簡単な方法です。削除したいバックグラウンドジョブの数がわからない場合は、jobsを実行します。

あるいは、次のようにしてプロセスIDを見つけることができます。

ps

それならあなたは走ることができます

kill -9 <Appropriate PID from ps output>
13
Olli

1)コンソール上でマルチユーザーモードになっている場合は、CTRL-ALT-Fnを押して別の画面にログインし、ps -ef | grep <myprocessname>またはpidof <myprocessname>を使用してID番号でプロセスをkill -9できます。

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

また、 htop をインストールすることで人生を少し楽にすることもできます。ほとんどのディストリビューションはリポジトリにありません。

3)ハングしたsshセッションで(たとえば別のシステムへの)ハングしたばかりの場合は、エスケープキーであるチルダ(〜)を押してからCtrlキーを押しながらZキーを押してホストセッションに戻ります立ち往生しているsshプロセスを強制終了することも、タイムアウトするのを待つこともできます。

4
Linker3000

Bash(および他のシェルは?)のためのもっと簡単な解決策は、することです:

Ctrl-z      followed by     kill -9 %1

'%1'は、殺されているジョブ番号を表します。他のジョブが既にスリープしている場合は、 '%2'(または他の何か)になる可能性があります。 Ctrl-zを押すと、どのジョブ番号かがわかります。

[1]+  Stopped                 <process name>

'kill'はシェルのkillのバージョンであり、/ bin/killではありません。

4
Dustin Boswell

/ etc/profileにSIGINT(2)で設定されたトラップがあるかもしれません。もしそうなら、それを削除します。ログアウトしてログインしなおすと、問題ないはずです。

0
TechNo_phile

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

0
ospider