すべてのバックグラウンドプロセスの終了

すべてのバックグラウンドプロセスの終了

Stoppedいくつかのバックグラウンドプロセスがあります。

kill $(jobs -p)そしてkill `jobs -p`効果もありません。

kill %1などを使用してkill %2各プロセスを正常に終了します。

1つのコマンドですべてのバックグラウンドプロセスを終了するには?

また、最初の2つのコマンドが私にうまくいかないのはなぜですか?

私はLinux Mint 15、64ビットを実行しています。

答え1

彼らが走るとき

killの出力でこれを行うことができるようですjobs -p

はい

$ sleep 1000 &
[1] 21952
$ sleep 1000 &
[2] 21956
$ sleep 1000 &
[3] 21960

3つの偽のジョブが実行されています。

$ jobs
[1]   Running                 sleep 1000 &
[2]-  Running                 sleep 1000 &
[3]+  Running                 sleep 1000 &

次のようにそれらを殺す:

$ kill $(jobs -p)
[1]   Terminated              sleep 1000
[2]-  Terminated              sleep 1000
[3]+  Terminated              sleep 1000

彼らが消えたことを確認してください。

$ jobs
$

彼らが止まるとき

ジョブを実行するのではなくジョブを停止した場合は、これを実行できます。

はい

$ kill $(jobs -p)

$ jobs
[1]+  Stopped                 sleep 1000
[2]-  Stopped                 sleep 1000
[3]   Stopped                 sleep 1000

まあ、それはそれらを殺さなかったが、プロセス自体が終了信号を処理できなかったので中断されました。だからOSに死ぬと言ってください。それがまさにa-9の目的です。

$ kill -9 $(jobs -p)
[1]+  Killed                  sleep 1000
[2]-  Killed                  sleep 1000
[3]   Killed                  sleep 1000

これは良いです。

$ jobs
$ 

一部が実行中で、一部が停止している場合

一部は停止し、一部は実行中のプロセスが混在している場合はkill最初に実行してから実行できますkill -9

$ kill $(jobs -p); sleep <time>; \
    kill -18 $(jobs -p); sleep <time>; kill -9 $(jobs -p)

プロセスが最初に停止するのにさらに時間がかかる場合は、時間を少し延ばしてください。

シグナル

HUP(-1)またはSIGTERM(-15)で倒すと成功しません。しかし、なぜ?これは、これらの信号がアプリケーションにセルフシャットダウンを指示するため、より使い慣れているためです。ただし、アプリケーションが停止しているため、これらの信号を処理できません。したがって、唯一のオプションはSIGKILL(-9)を使用することです。

kill提供されているすべての信号を見ることができますkill -l

$ kill -l | column -t
1)   SIGHUP       2)   SIGINT       3)   SIGQUIT      4)   SIGILL       5)   SIGTRAP
6)   SIGABRT      7)   SIGBUS       8)   SIGFPE       9)   SIGKILL      10)  SIGUSR1
11)  SIGSEGV      12)  SIGUSR2      13)  SIGPIPE      14)  SIGALRM      15)  SIGTERM
16)  SIGSTKFLT    17)  SIGCHLD      18)  SIGCONT      19)  SIGSTOP      20)  SIGTSTP
21)  SIGTTIN      22)  SIGTTOU      23)  SIGURG       24)  SIGXCPU      25)  SIGXFSZ
26)  SIGVTALRM    27)  SIGPROF      28)  SIGWINCH     29)  SIGIO        30)  SIGPWR
31)  SIGSYS       34)  SIGRTMIN     35)  SIGRTMIN+1   36)  SIGRTMIN+2   37)  SIGRTMIN+3
38)  SIGRTMIN+4   39)  SIGRTMIN+5   40)  SIGRTMIN+6   41)  SIGRTMIN+7   42)  SIGRTMIN+8
43)  SIGRTMIN+9   44)  SIGRTMIN+10  45)  SIGRTMIN+11  46)  SIGRTMIN+12  47)  SIGRTMIN+13
48)  SIGRTMIN+14  49)  SIGRTMIN+15  50)  SIGRTMAX-14  51)  SIGRTMAX-13  52)  SIGRTMAX-12
53)  SIGRTMAX-11  54)  SIGRTMAX-10  55)  SIGRTMAX-9   56)  SIGRTMAX-8   57)  SIGRTMAX-7
58)  SIGRTMAX-6   59)  SIGRTMAX-5   60)  SIGRTMAX-4   61)  SIGRTMAX-3   62)  SIGRTMAX-2
63)  SIGRTMAX-1   64)  SIGRTMAX

さまざまな信号の詳細については、信号のマニュアルページを確認することをお勧めしますman 7 signal

答え2

これを試してみてください。

for x in `jobs -p`; do kill -9 $x; done

ただし、プロセスを終了するには、次のコマンドを実行できます。

for x in `jobs -p`; do kill -15 $x; done

~からウィキペディアコマンドページKill

プロセスは以下を送信できます。信号用語信号は4つの方法で送信されます(この場合、プロセスIDは「1234」です)。

kill 1234
kill -s TERM 1234
kill -TERM 1234
kill -15 1234

プロセスを送信できます。信号を殺す信号を送信する3つの方法:

kill -s KILL 1234
kill -KILL 1234
kill -9 1234

説明したようにこれ答え、これは違いです終了そして殺す

終了信号、信号用語、はプログラムで傍受できる信号です。通常、バックグラウンドで実行されているプロセスはこの信号をキャプチャして終了プロセスを開始して完全に終了します。キル信号、信号を殺す、ブロックできません。プロセスに転送されると、プログラムは突然終了します。

たとえば、コンピュータをシャットダウンまたは再起動すると、通常、次のメッセージが表示されます。信号用語実行中のプロセスに最初に送信されサポートされている場合は、完全に終了できます。それから数秒後に信号を殺す使用中のリソース(使用中のファイルなど)が強制的に解放され、シャットダウンシーケンスが続行されるように(ファイルシステムのマウント解除など)、実行中のプロセスに転送されます。

答え3

さて、これで遊んで停止したタスク(実行が一時停止されたが終了していない場合)を終了すると、フォアグラウンドにインポートされるまで完了しないことがわかりました。プログラムは通常、端末で-を押すとCtrl停止します。Zほとんどの端末はこの場合に送信しますがSIGSTOP、もちろんやkill -STOPを使用するなど他の送信方法もありますkill -19

SIGTERM送信された基本信号を処理するにはプログラムが実行されている必要があるため、プログラムがすぐに完了しないのは通常の動作ですkill。また、時にはバックグラウンドプロセスにbash送信した後に何らかの方法SIGTERMで停止することもあります(SIGTERMまだ静止していますが)。

すべてのことを完了する最も安全な方法(いいえkill -9) まず、SIGTERM通常の転送を行い、次に残りのkillタスクSIGCONTを転送します。たとえば、次のようになります。

kill $(jobs -p)
kill -18 $(jobs -p)

SIGCONT(セマフォ18)は停止したジョブを前景に持ち込み、通常SIGTERMどおりに処理できるようにします。

すべてのプログラムがこれを完了しない場合は通常kill -9。これは通常、制御端末が閉じたとき、特にセッションの終わりに送信されます。シェルなどの多くの対話型プログラムは、他の終了信号ではなくこの信号に応答します。これは、セッションが終了しても(または制御端末が閉じられた後でも)実行を続けることが問題になるためです。これを試すには、次のようにします。SIGHUPSIGHUPsshttyssh

kill -1 $(jobs -p)
kill -18 $(jobs -p)

もちろん、信号を処理できるようにプログラムが停止していないことを再確認する必要があります。試すことができる他の終了信号はSIGINTkill -2)とSIGQUITkill -3)です。しかし、もちろん、完全なスペクトルを試すことによって得ることができる利点は減少し、避けられない結果SIGKILL(別名kill -9)につながる可能性があります。

答え4

これにより、現在のシェルのすべてのアクションが1つずつ終了します。

while kill %; do :; done

説明:%リストの最後の操作を参照するため、killゼロ以外の値が返されるまで繰り返されます。つまり、これ以上終了する操作がないことを意味します。

もう一つのアプローチは最初に送信することですSIGTERM。その後、SIGCONT作業を​​続けることができ、最初にすべきことは受け取ることですSIGTERM

/bin/kill $(jobs -p) && /bin/kill -CONT $(jobs -p)

(内蔵されたものがなんだか不思議なのでkillここでは外部を使用しています。)

関連情報