
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
。これは通常、制御端末が閉じたとき、特にセッションの終わりに送信されます。シェルなどの多くの対話型プログラムは、他の終了信号ではなくこの信号に応答します。これは、セッションが終了しても(または制御端末が閉じられた後でも)実行を続けることが問題になるためです。これを試すには、次のようにします。SIGHUP
SIGHUP
ssh
tty
ssh
kill -1 $(jobs -p)
kill -18 $(jobs -p)
もちろん、信号を処理できるようにプログラムが停止していないことを再確認する必要があります。試すことができる他の終了信号はSIGINT
(kill -2
)とSIGQUIT
(kill -3
)です。しかし、もちろん、完全なスペクトルを試すことによって得ることができる利点は減少し、避けられない結果SIGKILL
(別名kill -9
)につながる可能性があります。
答え4
これにより、現在のシェルのすべてのアクションが1つずつ終了します。
while kill %; do :; done
説明:%
リストの最後の操作を参照するため、kill
ゼロ以外の値が返されるまで繰り返されます。つまり、これ以上終了する操作がないことを意味します。
もう一つのアプローチは最初に送信することですSIGTERM
。その後、SIGCONT
作業を続けることができ、最初にすべきことは受け取ることですSIGTERM
。
/bin/kill $(jobs -p) && /bin/kill -CONT $(jobs -p)
(内蔵されたものがなんだか不思議なのでkill
ここでは外部を使用しています。)