题 我该怎样杀死所有停止的工作?


当我尝试退出Linux服务器时,我收到消息:

有停止的工作。

:有一个命令可以杀死这些吗?


80
2018-02-25 10:07




U&L Q&A中的其他示例: unix.stackexchange.com/questions/124428/... - slm
我现在有相反的问题,当我退出shell时它不会警告停止的工作!不得不放 shopt -s checkjobs 在我的.bashrc中 - Sam Watkins
再次按ctrl + d,它会让你现在退出,在这个过程中杀死那些工作 - Jens Timmerman


答案:


要快速终止在bash下运行的所有作业,请输入:

kill `jobs -ps`

jobs -ps 列出已停止作业的进程ID。 kill `jobs -ps` 将TERM信号发送到所有已停止的作业。


69
2018-02-25 10:15



-1为“杀死工作” - Tibor
当工作是“sudo su”时没用。即 sudo kill `jobs -p` 没有工作,但明确键入PID做了。 - user13107
为什么这个投票如此高涨?这是不对的。如果进程停止,那么a kill 例如,这将不执行任何操作,因为进程已停止,它们将不会处理默认情况下发送给它们的SIGTERM(-15)。 - slm
kill -9会做到这一点。 - Blossoming_Flower
显然错误的答案! - mrangry777


尝试输入:

kill -9 $(jobs -p)

76
2018-02-25 10:14



应该这样做,但我认为他应该在发送SIGKILL(-9)之前首先发送一个SIGTERM(-15)。所以也许提出类似“kill $(jobs -p); sleep 3s; kill -9 $(jobs -p)”的东西会更好。首先发送SIGTERM作业可以做一个干净的退出(释放分配的资源等)。 - rems
Kevin Duke,你的回答是对我有用的。我不能投票,因为我没有15的声誉。 kill -9 $(jobs -p)
@rems除了,正如slm指出的那样,他们不会得到SIGTERM,因为他们已经停止了。 - Paul Gear
不适用于zsh。由于 zsh不是POS  IX符合工作要求。 - Max Coplan


接受的答案会杀死所有工作(在这种情况下就足够了)而不仅仅是已停工的工作。如果您只想杀死已停止的,请运行:

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

16
2018-03-08 18:04



grep / cut可以组合在一个awk命令中: awk '/Stopped/{print $3}') - laebshade
该 -s 关于已接受答案的论点只过滤了已停止的答案 - 79E09796


最简单的方法就是简单地立即重试退出; bash 将这意味着“杀死所有停止的工作并退出”。


12
2018-03-08 18:13



这将发送一个HUP,它不一定会停止任何工作。 - Stephen Niedzielski


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

7
2018-02-26 10:22



您可以为此行添加代码格式,以便于阅读。 - drcelus
你能再次看看你的格式 - 在行的开头使用四个空格来将块标记为代码(而不是使用反引号)。目前尚不清楚您是在代码中使用反引号,还是尝试使用反引号显示代码。 - dunxd
格式化很好。我们必须使用反引号传递作业-p,否则它不会将其视为命令,它将引发错误。 - monu


如果要删除某些已停止的作业但不是全部,请尝试以下操作:

首先,列出工作,你会得到这样的东西:

$ 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
2018-05-30 04:16





通常,如果您收到该消息,则需要注销两次。例如。第一 按Ctrl + d 为您提供警告消息,通知您已停止的作业,第二次按下将导致您取消作业。这同样适用于 logout 和 exit 命令。

要手动杀死它们,请尝试: kill $(jobs -p)


如果您不想从当前shell中删除作业,则可以从活动作业表中删除它们,而不必使用 disown 命令。例如。

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

停工也可以由过程的状态决定(T 字符)这意味着该过程被诸如此类的信号所阻止 SIGSTOPSIGTSTP 或其他(如 SIGTTIN, 要么 SIGTTOU)。

万一的时候 jobs shell builtin命令不可用,可以通过以下命令列出已停止的进程:

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
2018-02-19 20:46