web-dev-qa-db-ja.com

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

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

停止中のジョブがあります。

:これらを強制終了する単一のコマンドはありますか?

95
Yazz.com

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

kill -9 `jobs -ps`

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

78
ooshro

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

kill -9 $(jobs -p)
84
dukevin

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

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

最も簡単な方法は、実際に出口をただちに再試行することです。 bashは、「停止したすべてのジョブを終了して終了する」という意味です。

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

万が一これが他の人を助ける場合に備えて-ほとんどの人は、シェルを介してバックグラウンドで開始したプロセスをいくつか停止したため、ここにいます。ルートとして、他のユーザーによって停止されたプロセスを見つける必要がありました。そのため、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
5
hwjp

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

まず、求人を一覧表示すると、次のようになります。

$ 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
sergei

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

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


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

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

停止したジョブは、プロセスの状態(T文字)によっても判別できます。つまり、プロセスは、SIGSTOPSIGTSTPまたはその他(SIGTTINSIGTTOUなど)のシグナルによって停止されました。

シェルの組み込みコマンド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
4
kenorb