Linuxサーバーを終了しようとすると、次のメッセージが表示されます。
停止したジョブがあります。
:これらを殺す単一のコマンドはありますか?
shopt -s checkjobs
私の.bashrc を入れなければなり
Linuxサーバーを終了しようとすると、次のメッセージが表示されます。
停止したジョブがあります。
:これらを殺す単一のコマンドはありますか?
shopt -s checkjobs
私の.bashrc を入れなければなり
回答:
bashの下で停止しているすべてのジョブをすばやく強制終了するには、次のように入力します。
kill -9 `jobs -ps`
jobs -ps
-p
停止(-s
)ジョブのプロセスID()をリストします。
kill -9 `jobs -ps`
SIGKILLシグナルをそれらすべてに送信します。
sudo kill `jobs -p`
動作しませんでしたが、PIDを明示的に入力しました。
kill
これは何もしません。デフォルトで送信されるSIGTERM(-15)を処理しません。
これを入力してみてください:
kill -9 $(jobs -p)
最も簡単な方法は、実際にはただちに出口を再試行することです。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 -ps
は、この回答よりも簡単です。そうは言っても、この回答はCtrl-Z
シェルで停止したジョブのみを表示するのではなく、すべての停止したジョブを表示します:他のシェル、他のユーザー、デバッグ中のジョブ(gdbなど)。
ps -el | grep T
状態「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警告メッセージが表示され、停止したジョブについて通知されます。もう一度押すと、ジョブを強制終了してログアウトします。これは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