停止したすべてのジョブを強制終了するにはどうすればよいですか?


91

Linuxサーバーを終了しようとすると、次のメッセージが表示されます。

停止したジョブがあります。

:これらを殺す単一のコマンドはありますか?



私は今、反対の問題を抱えていました。シェルを終了しても、停止したジョブについて警告しません!shopt -s checkjobs私の.bashrc を入れなければなり
サムワトキンス14

1
プレスCTRL +は、再び、それはプロセスでこれらのジョブを殺し、あなたは今すぐ終了させますdは
イェンスTimmerman

回答:


73

bashの下で停止しているすべてのジョブをすばやく強制終了するには、次のように入力します。

kill -9 `jobs -ps`

jobs -ps-p停止(-s)ジョブのプロセスID()をリストします。
kill -9 `jobs -ps`SIGKILLシグナルをそれらすべてに送信します。


22
「ジョブを

1
ジョブが「sudo su」だったときに機能しませんでした。すなわち、sudo kill `jobs -p`動作しませんでしたが、PIDを明示的に入力しました。
user13107

14
なぜこれが非常に高く評価されているのですか?それは間違っています。プロセスが停止している場合、プロセスは停止しているため、killこれは何もしません。デフォルトで送信されるSIGTERM(-15)を処理しません。
slm 14

6
kill -9はトリックを行います。
timetofly 14年

84

これを入力してみてください:

kill -9 $(jobs -p)

9
これでうまくいくはずですが、SIGKILL(-9)を送信する前に、まずSIGTERM(-15)を送信する必要があると思います。したがって、「kill $(jobs -p); sleep 3s; kill -9 $(jobs -p)」のようなものを提案する方が良いでしょう。最初にSIGTERMを送信すると、ジョブはクリーンな出口(割り当てられたリソースの解放など)を実行できる場合があります。
11

3
ケビンデューク、あなたの答えは私のために働いたものです。評判が15に達していないので投票できませんでした。kill -9 $(jobs -p)

2
@remsただし、slmが指摘したように、停止しているためSIGTERMを取得することはできません。
ポール・ギア


次に、zshに対処する方法は?
fx-kirin

16

受け入れられた回答は、停止したジョブだけでなく、すべてのジョブを殺します(この場合はこれで十分です)。停止したものだけを殺したい場合は、以下を実行します:

kill $(jobs -l | grep Stopped | cut -d' ' -f3)

grepを/カットが1つのawkコマンドで組み合わせることができます: awk '/Stopped/{print $3}')
laebshade

2
-s受け入れ答えフィルターだけで停止したもので、引数
79E09796


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

2
この行にコードの書式設定を追加して、読みやすくすることができます。
drcelus

書式設定をもう一度見てください-行頭の4つのスペースを使用して、ブロックをコードとしてマークします(バックティックを使用するのではなく)。現時点では、コードでバックティックを使用しているか、バックティックを使用してコードを表示しようとしているかは明確ではありません。
dunxd

フォーマットは問題ありません。バックティックを使用してジョブ-pを渡す必要があります。それ以外の場合はコマンドとは見なされず、エラーがスローされます。
monu

5

これが他の誰かを助ける場合に備えて-ほとんどの人はここにいるのです 他のユーザーによって停止されたプロセスをルートとして見つける必要がありましたが、このプロセスではjobsコマンドのバリエーションは実行できません。

少し掘り下げman psて、これに私を導きました:

ps -a -o pid,user,cmd,state | grep 'T$'

説明:-aフラグは、すべてのプロセスを表示してから-o出力を制御し、各プロセスについて表示される情報を制御します。私が選択しているのpidusercmd(コマンドライン)でありstateプロセス状態です。

からman ps

PROCESS STATE CODES
   Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the
   state of a process:
           D    uninterruptible sleep (usually IO)
           R    running or runnable (on run queue)
           S    interruptible sleep (waiting for an event to complete)
           T    stopped, either by a job control signal or because it is being traced
           W    paging (not valid since the 2.6.xx kernel)
           X    dead (should never be seen)
           Z    defunct ("zombie") process, terminated but not reaped by its parent

最後にgrep T$、最後の列にTがあるすべてのプロセスを表示するようにパイプします。

そして、停止状態にあるさまざまなユーザーからのすべてのプロセスの素晴らしいリストがあります。

$ ps -a -o pid,user,cmd,state | grep 'T$'
  865 joson74+ python                      T
  885 joson74+ sh -c less                  T
  886 joson74+ less                        T
 1014 minames+ python3.4 -i /home/minames  T
 5352 MooKo    nano stdio.h                T
 7851 harry    tmux attach                 T
12083 harry    tmux attach                 T
13495 gorylla+ python3.4 -i /home/gorylla1 T
18009 conr1d   vim                         T
19664 enythin+ python                      T
24906 wardlist python                      T

停止したジョブを現在のシェルにアタッチするにjobs -psは、この回答よりも簡単です。そうは言っても、この回答はCtrl-Zシェルで停止したジョブのみを表示するのではなく、すべての停止したジョブを表示します:他のシェル、他のユーザー、デバッグ中のジョブ(gdbなど)。
ステファンゴーリチョン

私にとって最良の答えですが、正確には機能していません。ps -el | grep T状態「T」のプロセスを見つけるために使用する必要がありました。
dr0i

4

停止したジョブの一部を削除するが、すべてを削除したくない場合は、これを試してください:

まず、ジョブをリストします。次のようなものが得られます。

$ jobs -l

[2]   4813 Stopped                 ./parse < call.txt
[3]-  4819 Stopped                 ./parse < call.txt

停止したジョブにkillを送信します。フォアグラウンドでそれをもたらすこと以外は何もしません。終了します。

$ fg %2
./parse < call.txt
Terminated

$ jobs -l
[3]-  4819 Stopped                 ./parse < call.txt

4

通常、そのメッセージを受け取った場合は、2回ログアウトする必要があります。たとえば、最初にCtrl+D警告メッセージが表示され、停止したジョブについて通知されます。もう一度押すと、ジョブを強制終了してログアウトします。これはlogoutexitコマンドにも同じことが当てはまります。

それらを手動で強制終了するには、次を試してくださいkill $(jobs -p)


現在のシェルからジョブを強制終了したくない場合は、disownコマンドを使用して、強制終了せずにアクティブなジョブのテーブルからジョブを削除できます。例えば

$ sleep 1000 &
[1] 19404
$ jobs
[1]+  Running                 sleep 1000 &
$ disown

また、工程(の状態によって決定することができる停止ジョブTプロセスを意味する文字)のような信号により停止したSIGSTOPSIGTSTPまたは他の(のようなSIGTTIN、またはSIGTTOU)。

場合にはjobs、シェル組み込みコマンドが利用できない場合、プロセスは次のコマンドでリストすることができる停止。

ps wuax | awk '$8 ~ "T"'

それらをすべて殺すには、基本的に次のように入力できます:

kill -9 $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')

以下に簡単なテストを示します。

$ sleep 1000 &
[1] 2014
$ sleep 1000 &
[2] 2015
$ sleep 1000 &
[3] 2016
$ sleep 1000 &
[4] 2017
$ killall -STOP sleep
[1]   Stopped                 sleep 1000
[2]   Stopped                 sleep 1000
[3]   Stopped                 sleep 1000
[4]   Stopped                 sleep 1000
$ ps wuax | awk '$8 ~ "T"'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
vagrant   2014  0.0  0.0   7228   832 pts/0    T    20:38   0:00 sleep 1000
vagrant   2015  0.0  0.0   7228   708 pts/0    T    20:38   0:00 sleep 1000
vagrant   2016  0.0  0.0   7228   760 pts/0    T    20:38   0:00 sleep 1000
vagrant   2017  0.0  0.0   7228   828 pts/0    T    20:38   0:00 sleep 1000
$ kill -9 $(awk 'NR>1 && $8 ~ "T" {print $2}' <(ps wuax))
$ jobs
[1]   Killed                  sleep 1000
[2]   Killed                  sleep 1000
[3]   Killed                  sleep 1000
[4]   Killed                  sleep 1000
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.