linux:バックグラウンドタスクを強制終了


194

Linuxで最後に生成されたバックグラウンドタスクを終了するにはどうすればよいですか?

例:

doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????

18
どうしてこれはプログラミング関連ではないのでしょうか?Bashプログラミングはプログラミングではありませんか?
flybywire、2009年

6
これはSOとSUの間のオーバーラップ領域にありますが、ここではSOに適しています。このように考えるための私の基準は、@ flybywireがスクリプトでこれを行っている場合、それはプログラミングであることです。彼がコマンドラインからそれをしたかっただけなら、私はそれがSUに属していると思います。
トカゲに請求する

10
シェルスクリプトもプログラミングです。
cletus 2009年

回答:


234

このための特別な変数がbashにあります:

kill $!

$!バックグラウンドで実行された最後のプロセスのPIDに展開されます。


68
@ polm23; いいえ、^Zバックグラウンドジョブではなく、ジョブを停止します。後続bgは実際の「バックグラウンド」を実行し(バックグラウンドで実行を再開)、その後は$!期待どおりに機能します。
falstro

????killの後に実行される1つ以上のコマンドを表すと仮定して、これらのコマンドのいずれかがバックグラウンドプロセスによって行われた作業に依存している場合、バックグラウンドプロセスが後にシグナルハンドラーで実行する可能性があるクリーンアップまたは仕上げタスクに注意してください(トラップ可能な)信号を受信します。そのような「依存」コマンドの最初の直前にwait(おそらくa syncまたはaも続く)を追加するのが最善sleep <n>です。
ACK

2
完了の場合:単一の%は現在のジョブも参照するため、「kill%」を使用して停止したジョブ(^ z)を強制終了できます。私はこれを^ z以降にほぼ常に使用します。
t3o

これは、対話型シェルでデフォルトでのみ有効になっているジョブ制御が有効になっている場合にのみ機能します(ただし、ctrl-zの使用を参照しているため、対話型シェルの使用も参照していると思います)-これは、ここで他の回答で概説されていますが、これが「完全を
期す

289

ジョブ番号で殺すことができます。タスクをバックグラウンドで実行すると、次のようになります。

$ ./script &
[1] 35341

これ[1]はジョブ番号であり、次のように参照できます。

$ kill %1
$ kill %%  # Most recent background job

ジョブ番号のリストを表示するには、jobsコマンドを使用します。他の投稿者man bash

シェルでジョブを参照するには、いくつかの方法があります。キャラクター%はジョブ名を紹介します。ジョブ番号nはと呼ばれることがあります%n。ジョブは、その開始に使用された名前のプレフィックスを使用して、またはそのコマンドラインに表示される部分文字列を使用して参照される場合もあります。たとえば%ce、停止したceジョブを指します。プレフィックスが複数のジョブに一致する場合、bashはエラーを報告します。%?ce一方、を使用すると、ceコマンドラインに文字列を含むジョブを参照できます。サブストリングが複数のジョブに一致する場合、bashはエラーを報告します。シンボル%%%+現在のジョブに関するシェルの概念を参照してください。これは、フォアグラウンドにあるか、バックグラウンドで開始されている間に停止された最後のジョブです。以前のジョブは、を使用して参照できます%-。ジョブに関連する出力(たとえば、jobsコマンドの出力)では、現在のジョブには常にのフラグが付けられ+、前のジョブにはのフラグが付けられ-ます。単一%(付随するジョブ指定なし)も現在のジョブを参照します。


記録として、これはジョブ制御が有効になっている場合にのみ機能すると思います。スクリプト(set -m)でオンにできると思いますが、インタラクティブな使用を目的としています。stackoverflow.com/questions/690266/…もご覧ください
falstro '18年

9
非常に便利な記号、これら%1%%-特に。Ctrl-Cでは死ぬものがないので、Ctrl-Zを押してからkill -9 %%。私が便利だと思った1つの例は次のとおりですwhile true; do mplayer <some unstable online radio>; date >> restarts.log; done。前に私がしなければならなかったpsかもしれないかjobs -l、そして退屈であるPIDを、再入力します。
Tomasz Gandor 2014年

すべての仕事に1つありますか?
CMCDragonkai 2014

3
@TomaszGandorそのためwhile true、に置き換えたい場合がありますwhile sleep 1。これにより、再起動する前に少し遅れてそれを受け入れることができます。ctrl-cを2回押すと、2番目はスリープを中断し、ゼロ以外の終了で終了してループを抜けます。
falstro

45

次のコマンドは、pidとともに、セッション内のすべてのバックグラウンドプロセスのリストを提供します。その後、それを使用してプロセスを強制終了できます。

jobs -l

使用例:

$ sleep 300 &
$ jobs -l
[1]+ 31139 Running                 sleep 300 &
$ kill 31139

25

これにより、すべてのバックグラウンドプロセスが強制終了されます。

jobs -p | xargs kill -9

1
これは私が以前使用したものですが、kill -9 %%タイピングは少なくなります:)
Tomasz

4
@TomaszGandorこれは、現在のジョブ、つまり最後のジョブがフォアグラウンドで停止したか、バックグラウンドで開始したジョブのみを強制終了します。回答のコマンドはすべてのジョブを強制終了します。
bitek


2
skill doB

skill は、指定した基準に基づいて1つまたは複数のプロセスを選択できるkillコマンドのバージョンです。


0

そのpidが必要です...それを見つけるには "ps -A"を使用します。


0

これはトピック外の回答ですが、興味がある人にとっては、それは価値があるかもしれません。

@John Kugelmanの回答と同様に、%はジョブの指定に関連しています。 それを効率的に見つける方法は?lessの&patternコマンドを使用します。manは少ないページャーを使用しているようです(確信はありません)。次に入力します。


-3

killallコマンドを使用するだけです。

killallタスク名

詳細と詳細オプションを表示するには、「man killall」と入力してください。


4
PIDに実際に簡単にアクセスできる場合、killallは少し攻撃的だと思います。そして、特にrootの場合は危険です
Dave Vogt

3
システム内のどこかで有用な何かを実行している間、killall pythonまたは必要がある場合は、あまり役に立ちませんkillall java
Tomasz Gandor 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.