Unixでプロセスを中断する代わりに終了する


12

Unix、コマンドラインであればIプレスCtrl-Cむしろ割り込み、プロセスを終了し、私はプロンプトシェルに戻りません。

したがって、次の2つの質問があります。

    1. 中断されたすべてのプロセスのリストを表示して終了する方法はありますか?
    1. プロセスを中断する代わりに終了するには、どのキーの組み合わせを押しますか?

回答:



7

歴史的に、キーストロークにバインドされた3つの信号がありました。

  • SIGINT(Intettput)通常Ctrl+ CまたはDel
  • SIGQUIT-終了-通常Ctrl+にバインド\
  • SIGSUSPサスペンド-通常はCtrl+にバインドZ

一部の* 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を使用してプロセスを停止すると、さらに成功する場合がありますが、プロセスがシグナルをキャッチして無視する可能性があるため、これは当てはまらない場合があります。

プロセスが割り込みをキャッチして無視したか、または終了したため、「割り込みされた」プロセスのリストという概念はありません。ジョブを入力して、中断されたプロセスのリストを取得できます


^ Qと^ Sが(あなたのように)表示さstty -ixonれているが、それらが通過するように設定されているのは興味深いことです。私は彼らがに変わると思うだろう<undef>
追って通知があるまで一時停止します。

OS XボックスまたはDebian LennyボックスのマニュアルページにSIGSUSPが見つかりません。SIGTSTPのようです。
dmckee ---元モデレーター子猫

DEL-

5

正解はたくさんありますが、完全なものはありません。

  1. 他の多くの人が言っているように:Control-Cは通常UNIXシグナルSIGINTを送信し、デフォルトの動作(オーバーライドしないプログラムから)は「プロセスの終了」です。プログラムは、このシグナルを無視するか、必要に応じて別のアクションを実行できます。
  2. Control- \を使用して、キーボードからSIGQUITを送信することもできます。ここでの違いは、デフォルトではプロセスがコアファイルを書き込んでから終了することです。プログラムは、このシグナルを無視するか、必要に応じて別のアクションを実行できます。
  3. プロセスを停止させずに極端な先入観で終了するには、SIGKILLを使用します。SIGKILLはデフォルトではどのキーにもバインドされていません。代わりに、通常はkill (1)コマンドを使用して送信し、次のように送信する信号を指定します

    $ kill -9 <process ID>
    

    またはニーモニック

    $ kill -KILL <process ID>
    

    この信号はOSによって直接処理され、プログラムはデフォルトの動作をオーバーライドできません

  4. シェルがジョブ制御をサポートしている場合、キャットウォークのanswerのようにキャラクターをkill使用したジョブ識別をサポートする組み込みバージョンもサポートしている場合があります%

  5. 再開可能な方法でプロセスを一時停止するには、SIGTSTPを送信するControl-zを使用します。このようなプロセスを再開するにfgは、端末の制御を継続するか、端末の制御維持bgに実行を設定します(ただし、デフォルトでは出力を送信します)。

また、SIGQUITでコアをダンプすることは、多くの管理上の詳細に依存します。ulimit -c、Solaris上のcoreadm(1M)など。別の注意事項-fgはSIGCONTシグナルを送信します。これにより、プロセスは動作を再開します。
タデウシュA.カドウボウスキ


1

Ctrl-CはSIGINTを送信します。これにより、デフォルトでプロセスが終了しますが、(を\bin sh使用してtrap)でトラップできます。

SIGKILLは、トラップできないキルシグナルです。

編集 3回目、これは正しいと思います。ドキュメントに対してすべてをチェックしました。表示されます。


SIGKILLはトラップできません。

うん。私はすでに固定したいこと...
チャールズ・スチュワート

1

これは、ほとんどの端末初心者には明らかではありませんが、問題が対話型プログラムを使用しているだけで、抜け出す方法がわからない場合、非常に頻繁qに終了します。たとえば、これはexitのキーです。これは、ページlessを表示するときに取得するプログラムなどでもありますman

一部のプログラムには、終了するための他のキーボードショートカットがあります。ではvimまたはvi、使用ESC:wq。ではemacs、使用Control-C Control-X。ではnanoまたはpico、使用Control-X。これらの例では、特に、編集中のファイルに加えた変更をショートカットが保存するかどうかに関して微妙な点があることに注意してください。


それで、標準は何ですか?
パセリエ

0

多くのプロセスは、割り込みシグナルをキャッチするために割り込みハンドラーをインストールできますが、デフォルトでは中断しないものは中止されます。

プロセスを強制終了するには、SIGQUIT(Ctrl- \)を送信できます。


SIGQUITはトラップできますが、SIGKILLはトラップできません。
チャールズスチュワート

1
@Charles:もう1つの違いは、SIGQUITはデフォルトでコアをダンプしますが、SIGKILLはそうしないことです。
タデウシュA.カドウボウスキ

0

他の答えもありそうなシナリオのようですが、その子を正しく処理しないスクリプトを実行している可能性もあります。私は最近、スクリプトを殺してもそのスクリプトの子プロセスが殺されないという同様のシナリオを経験しました。

一般的に、この状況に陥った場合、実行中のすべてのプロセスを確認する必要があります。psのマンページを確認する必要があります。(man ps)特にps auxwf、プロセス間の親/子関係を示すの使用が好きです。pstree同様のことを行います。プロセスを強制終了する前に別の端末からこれを実行して、通常の状況でどのように見えるかを確認し、子プロセスを特定する必要があります。

その後、そのメインプロセスを(^ Cで)強制終了する場合、psの出力を再度チェックして、何か変更があったかどうかを確認します。子プロセスがまだ存在している場合、killコマンドでそれらを殺すことができます。(を参照man kill

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