2011-02-09 08:49:24 +0000 2011-02-09 08:49:24 +0000
183
183

Ctrl + C でプロセスを強制終了できないときの対処法は?

Ctrl + C で現在のプロセスを強制終了できるとは限りません(例えば、そのプロセスが特定のネットワーク操作でビジー状態になっている場合など)。その場合、カーソルのそばに"^C “が表示されるだけで、他には何もできません。

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

回答の要約:通常は、Ctrl + Zでプロセスをスリープ状態にしてから、ps などのツールでプロセスのpidを見つけるkill -9 _process-pid_を実行します。Bash ](http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29) (および他のシェルの場合もあります)では、kill -9 %1 (または一般的には ‘%N’ ) を実行した方が簡単です。Ctrl + Zが効かない場合は、別のターミナルを開いてそこからkillする必要があります。

回答 (9)

127
127
127
2011-02-09 09:13:54 +0000

Ctrl + C が動作しない理由の問題を理解するには、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](http://en.wikipedia.org/wiki/Unix_signal#SIGKILL), SIGSTOP などです。これらのシグナルは kill コマンドで送ることができます。ですから、ハングアップしている/ゾンビ化しているプロセスを殺すには、プロセスID (PID)を見つけてください。例えば、pgreppsを使って、killにしてみましょう:

% kill -9 PID
119
119
119
2011-02-09 09:36:15 +0000

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

37
37
37
2012-06-19 03:03:03 +0000

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

Ctrl+C:丁寧にプロセスをシャットダウンしてください。

33
33
33
2011-02-09 08:53:17 +0000

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
13
13
2011-02-09 08:53:41 +0000

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

または、

ps

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

5
5
5
2011-02-09 22:40:53 +0000

Bash (や他のシェルでは?) のより簡単な解決法は次のようにします:

Ctrl-z followed by kill -9 %1

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

[1]+ Stopped <process name>

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

4
4
4
2011-02-09 09:01:45 +0000

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

3) もし ssh セッションがハングアップしているときは (例えば別のシステムへの) チルダ (~) を押してみてください、これはエスケープキーです、そして CTRL-Z を押してホストセッションに戻ります、そして、ハングアップしている ssh プロセスを kill するか、タイムアウトするのを待つことができます。

0
0
0
2017-04-18 10:41:06 +0000

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

0
0
0
2017-10-26 13:16:30 +0000

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

関連する質問

6
10
11
5
9