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

bash linux shell

Ctrl + C は、現在のプロセスを終了させるためには必ずしも機能しません (例えば、そのプロセスが特定のネットワーク操作でビジー状態になっている場合)。その場合、カーソルのそばに “^C” が表示されるだけで、それ以外のことはできません

端末を落とさずに今すぐそのプロセスを強制的に死なせる一番簡単な方法は?

回答のまとめです。通常、Ctrl + Z でプロセスをスリープ状態にしてから kill -9 _process-pid_ を行い、ps や他のツールでプロセスの pid を見つけることができます。Bash (および他のシェルの場合もあります) では、kill -9 %1 (または一般的には ‘%N’) の方が簡単です。Ctrl + Z がうまくいかない場合は、別のターミナルを開いてそこからキルする必要があります

  192  Dustin Boswell  2011-02-09


ベストアンサー

なぜ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を押すと、ほとんどのシェルがそうなるので、動作保証はありません)

プロセスで無視できない信号があります。SIGKILL, SIGSTOP などです。これらのシグナルは、killコマンドで送ることができます。つまり、ハンギング/ゾンビ化しているプロセスを kill するには、プロセス ID (PID) を見つけてください。例えば、pgreppsを使って、killとします

 % kill -9 PID

132  akira  2011-02-09


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

123  Teddy  2011-02-09


こちらのリンクもご覧ください

Ctrl+Z: 処理を一時停止します

Ctrl+C:丁重に今すぐプロセスを停止するようにお願いします

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

40  RoboAlex  2012-06-19


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を実行することができます(プロセスIDはps aから取得します)

33  Daniel Beck  2011-02-09


通常は、まだプロセスを停止しても(Ctrl + Z)、kill -9を使用することができます。kill -9では、まずプロセスのPIDが必要です。バックグラウンドジョブの場合は、kill -9 %1が最も簡単な方法です – 殺害したいバックグラウンドジョブの数がわからない場合は、jobsを実行してください

あるいは、プロセスIDを使って検索することもできます

ps

それから、あなたは実行することができます

kill -9 <Appropriate PID from ps output>

13  Olli  2011-02-09


もっと簡単なのは、Bash (と他のシェル?) の解決策です

Ctrl-z      followed by     kill -9 %1

ここで、’%1′ は殺されるジョブ番号を表します。すでに他のジョブが眠っている場合は、’%2′ (または他の何か) になるかもしれません。どのジョブ番号かは、Ctrl-zを押すとわかります

[1]+  Stopped                 <process name>

kill’ はシェル版の kill であり、/bin/kill ではないことに注意してください

5  community wiki  2011-02-09


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

2) リモートで接続している場合は、別の端末セッションで同様の操作を行ってください

また、htop をインストールすることで生活を少し楽にすることができます。ほとんどのディストロは htop をレポに持っています

3) ssh セッションがハングアップしている場合 (例えば別のシステムへ)、チルダ (~) を押してみてください。エスケープキーである CTRL-Z を押してホストセッションに戻ります

4  Linker3000  2011-02-09


tmuxやscreenを使っていて、上記のどれもうまくいかない場合は、<prefix> xでペインをキルしても、プロセスもキルされてしまいます

0  ospider  2017-04-18


etc/profile に SIGINT(2) が設定されている可能性があります。もしそうならば、それを削除してください。ログアウトして再度ログインすれば問題ありません

0  TechNo_phile  2017-10-26


タイトルとURLをコピーしました