でUnix
、コマンドラインであればIプレスCtrl-Cむしろ割り込み、プロセスを終了し、私はプロンプトシェルに戻りません。
したがって、次の2つの質問があります。
- 中断されたすべてのプロセスのリストを表示して終了する方法はありますか?
- プロセスを中断する代わりに終了するには、どのキーの組み合わせを押しますか?
でUnix
、コマンドラインであればIプレスCtrl-Cむしろ割り込み、プロセスを終了し、私はプロンプトシェルに戻りません。
したがって、次の2つの質問があります。
回答:
Ctrl+をC送信しSIGINT
ます。デフォルトでは、これによりアプリケーションが終了します。
これをCtrl-Z、アプリケーションをbashで一時停止すると混同しています。
歴史的に、キーストロークにバインドされた3つの信号がありました。
一部の* nixフレーバーには他のシグナルもバインドされており、コマンドを使用してキーボードバインドを確認できます。
stty -a
私のシステムOS / Xでは、次の出力が生成されます
speed 9600 baud; 65 rows; 213 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
この場合のkillは、現在の入力バッファをクリアするためのKILLシグナルではないことに注意してください。
SIGQUITを使用してプロセスを停止すると、さらに成功する場合がありますが、プロセスがシグナルをキャッチして無視する可能性があるため、これは当てはまらない場合があります。
プロセスが割り込みをキャッチして無視したか、または終了したため、「割り込みされた」プロセスのリストという概念はありません。ジョブを入力して、中断されたプロセスのリストを取得できます
正解はたくさんありますが、完全なものはありません。
プロセスを停止させずに極端な先入観で終了するには、SIGKILLを使用します。SIGKILLはデフォルトではどのキーにもバインドされていません。代わりに、通常はkill (1)
コマンドを使用して送信し、次のように送信する信号を指定します
$ kill -9 <process ID>
またはニーモニック
$ kill -KILL <process ID>
この信号はOSによって直接処理され、プログラムはデフォルトの動作をオーバーライドできません。
シェルがジョブ制御をサポートしている場合、キャットウォークのanswerのようにキャラクターをkill
使用したジョブ識別をサポートする組み込みバージョンもサポートしている場合があります。%
fg
は、端末の制御を継続するか、端末の制御を維持bg
せずに実行を設定します(ただし、デフォルトでは出力を送信します)。Ctrl-CはSIGINTを送信します。これにより、デフォルトでプロセスが終了しますが、(を\bin sh
使用してtrap
)でトラップできます。
SIGKILLは、トラップできないキルシグナルです。
編集 3回目、これは正しいと思います。ドキュメントに対してすべてをチェックしました。表示されます。
これは、ほとんどの端末初心者には明らかではありませんが、問題が対話型プログラムを使用しているだけで、抜け出す方法がわからない場合、非常に頻繁q
に終了します。たとえば、これはexitのキーです。これは、ページless
を表示するときに取得するプログラムなどでもありますman
。
一部のプログラムには、終了するための他のキーボードショートカットがあります。ではvim
またはvi
、使用ESC:wq
。ではemacs
、使用Control-C Control-X
。ではnano
またはpico
、使用Control-X
。これらの例では、特に、編集中のファイルに加えた変更をショートカットが保存するかどうかに関して微妙な点があることに注意してください。
多くのプロセスは、割り込みシグナルをキャッチするために割り込みハンドラーをインストールできますが、デフォルトでは中断しないものは中止されます。
プロセスを強制終了するには、SIGQUIT(Ctrl- \)を送信できます。
他の答えもありそうなシナリオのようですが、その子を正しく処理しないスクリプトを実行している可能性もあります。私は最近、スクリプトを殺してもそのスクリプトの子プロセスが殺されないという同様のシナリオを経験しました。
一般的に、この状況に陥った場合、実行中のすべてのプロセスを確認する必要があります。psのマンページを確認する必要があります。(man ps
)特にps auxwf
、プロセス間の親/子関係を示すの使用が好きです。pstree
同様のことを行います。プロセスを強制終了する前に別の端末からこれを実行して、通常の状況でどのように見えるかを確認し、子プロセスを特定する必要があります。
その後、そのメインプロセスを(^ Cで)強制終了する場合、psの出力を再度チェックして、何か変更があったかどうかを確認します。子プロセスがまだ存在している場合、kill
コマンドでそれらを殺すことができます。(を参照man kill
)
stty -ixon
れているが、それらが通過するように設定されているのは興味深いことです。私は彼らがに変わると思うだろう<undef>
。