Linuxサーバーを終了しようとすると、次のメッセージが表示されます。
停止中のジョブがあります。
:これらを強制終了する単一のコマンドはありますか?
Bashの下で停止したすべてのジョブをすばやく強制終了するには、次のように入力します。
kill -9 `jobs -ps`
jobs -ps
はプロセスIDをリストします(-p
)の停止(-s
)ジョブ。kill -9 `jobs -ps`
SIGKILLシグナルをそれらすべてに送信します。
これを入力してみてください:
kill -9 $(jobs -p)
受け入れられた回答は、停止された仕事だけでなく、すべての仕事(この場合はこれで十分です)を殺します。停止したものだけを殺したい場合は、次を実行:
kill $(jobs -l | grep Stopped | cut -d' ' -f3)
最も簡単な方法は、実際に出口をただちに再試行することです。 bash
は、「停止したすべてのジョブを終了して終了する」という意味です。
for x in `jobs -p` ; do kill -9 $x ; done
万が一これが他の人を助ける場合に備えて-ほとんどの人は、シェルを介してバックグラウンドで開始したプロセスをいくつか停止したため、ここにいます。ルートとして、他のユーザーによって停止されたプロセスを見つける必要がありました。そのため、jobs
コマンドのバリアントは機能しません。
man ps
を少し掘り下げて、次のようにしました。
ps -a -o pid,user,cmd,state | grep 'T$'
説明:-a
フラグは、すべてのプロセスを表示し、次に-o
が出力を制御し、各プロセスについてどの情報を表示するかを示します。 pid
、user
、cmd
(コマンドライン)、および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 -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
通常、そのメッセージが表示された場合は、2回ログアウトする必要があります。例えば。最初 Ctrl+D 停止したジョブについて通知する警告メッセージが表示されます。2回目に押すと、ログアウトしてジョブが強制終了されます。これは、logout
コマンドとexit
コマンドにも当てはまります。
それらを手動で強制終了するには、kill $(jobs -p)
を試してください。
現在のシェルからジョブを強制終了したくない場合は、disown
コマンドを使用して、強制終了せずにアクティブなジョブのテーブルからジョブを削除できます。例えば。
$ sleep 1000 &
[1] 19404
$ jobs
[1]+ Running sleep 1000 &
$ disown
停止したジョブは、プロセスの状態(T
文字)によっても判別できます。つまり、プロセスは、SIGSTOP
、SIGTSTP
またはその他(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