我怎样才能杀死所有停止的工作?

yaz*_*com 111 linux shell

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

有停止的工作。

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

oos*_*hro 97

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

kill -9 `jobs -ps`
Run Code Online (Sandbox Code Playgroud)

jobs -ps列出已-p停止 ( -s) 作业的进程 ID ( ) 。
kill -9 `jobs -ps`向所有这些发送 SIGKILL 信号。

  • -1 表示“杀死乔布斯” (22认同)
  • 为什么这个点赞这么高?这是错的。如果进程被停止,那么像这样的“kill”将什么也不做,因为进程被停止,它们不会处理默认发送给它们的 SIGTERM (-15)。 (15认同)
  • kill -9 可以解决问题。 (10认同)

duk*_*vin 88

尝试输入:

kill -9 $(jobs -p)
Run Code Online (Sandbox Code Playgroud)

  • 那应该可以,但我认为他应该先发送 SIGTERM (-15),然后再发送 SIGKILL (-9)。因此,也许提出诸如“kill $(jobs -p) ; sleep 3s ; kill -9 $(jobs -p)”之类的建议会更好。首先发送 SIGTERM 作业可能能够干净地退出(释放分配的资源等)。 (11认同)
  • 凯文杜克,你的答案对我有用。我无法投票,因为我的声誉没有 15。kill -9 $(jobs -p) (3认同)
  • @rems 除了,正如 slm 指出的那样,他们不会得到 SIGTERM,因为他们被停止了。 (2认同)
  • 不适用于 zsh。由于 [zsh 不是 POS](http://www.zsh.org/mla/workers/2006/msg00067.html) [IX 兼容作业](https://bugs.debian.org/cgi-bin/ bugreport.cgi?bug=346162)。 (2认同)

Kit*_*nde 17

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

kill $(jobs -l | grep Stopped | cut -d' ' -f3)
Run Code Online (Sandbox Code Playgroud)

  • 已接受答案的 `-s` 参数仅过滤已停止的答案 (3认同)

gee*_*aur 13

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

  • 这将发送一个不一定会停止任何作业的 HUP。 (4认同)

小智 7

for x in `jobs -p` ; do kill -9 $x ; done
Run Code Online (Sandbox Code Playgroud)

  • 您可以为此行添加代码格式以使其更易于阅读。 (2认同)

小智 5

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

首先,列出职位,你会得到这样的信息:

$ jobs -l

[2]   4813 Stopped                 ./parse < call.txt
[3]-  4819 Stopped                 ./parse < call.txt
Run Code Online (Sandbox Code Playgroud)

将kill发送到已停止的作业,除了将其放入前台之外,它不会执行任何操作,它将终止

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

$ jobs -l
[3]-  4819 Stopped                 ./parse < call.txt
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 5

通常,如果您收到该消息,则需要注销两次。例如,第一次Ctrl+D给你警告信息,通知你有关停止的作业,第二次按下将使你注销,杀死作业。这同样适用于logoutexit命令。

要手动杀了他们,试试:kill $(jobs -p)


如果您不想从当前的 shell 中杀死作业,可以使用disown命令将它们从活动作业表中删除,而无需杀死它们。例如

$ sleep 1000 &
[1] 19404
$ jobs
[1]+  Running                 sleep 1000 &
$ disown
Run Code Online (Sandbox Code Playgroud)

停止的作业也可以由进程的状态(T字符)确定,这意味着进程被诸如SIGSTOPSIGTSTP或其他(如SIGTTIN、 或SIGTTOU)之类的信号停止。

如果jobsshell 内置命令不可用,可以通过以下命令列出已停止的进程:

ps wuax | awk '$8 ~ "T"'
Run Code Online (Sandbox Code Playgroud)

要全部杀死它们,您基本上可以键入:

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

这是一个简单的测试:

$ 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
Run Code Online (Sandbox Code Playgroud)


hwj*_*wjp 5

以防万一这对其他人有帮助 - 大多数人在这里是因为他们有一些他们启动的停止进程,也许通过 shell 后台运行。我需要以 root 身份查找被其他用户停止的进程,对于该jobs命令的变体不会这样做。

一些挖掘man ps让我得到了这个:

ps -a -o pid,user,cmd,state | grep 'T$'
Run Code Online (Sandbox Code Playgroud)

说明:-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
Run Code Online (Sandbox Code Playgroud)

所以最后我把它传送到上面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
Run Code Online (Sandbox Code Playgroud)