当我尝试从Linux服务器退出时,出现以下消息:
有停止的工作。
:是否有单个命令可以杀死这些?
shopt -s checkjobs
输入我的.bashrc
当我尝试从Linux服务器退出时,出现以下消息:
有停止的工作。
:是否有单个命令可以杀死这些?
shopt -s checkjobs
输入我的.bashrc
Answers:
要快速杀死所有在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)
接受的答案将杀死所有作业(在这种情况下足够),而不仅仅是终止的作业。如果您只想杀死已停止的那些,请运行:
kill $(jobs -l | grep Stopped | cut -d' ' -f3)
awk '/Stopped/{print $3}')
-s
接受的答案的参数仅过滤已停止的答案
以防万一这对其他人有帮助-大多数人在这里是因为他们启动了一些已停止的进程,也许是通过Shell作为后台的。我需要找到被其他用户停止的根用户进程,而该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
shell 停止的作业,而是所有停止的作业:其他shell,其他用户,包括正在调试的作业(例如,由gdb进行调试)。
ps -el | grep T
查找状态为“ T”的进程。
通常,如果收到该消息,则需要注销两次。例如,第一个Ctrl+D向您发出警告消息,通知您有关已停止的作业,第二次按下将使您注销杀死这些作业。这与logout
和exit
命令相同。
要手动杀了他们,试试:kill $(jobs -p)
。
如果不想从当前shell中终止作业,则可以使用disown
命令从不删除作业的情况下将它们从活动作业表中删除。例如
$ sleep 1000 &
[1] 19404
$ jobs
[1]+ Running sleep 1000 &
$ disown
停止的作业还可以通过进程的状态(T
字符)来确定,这意味着进程已通过诸如SIGSTOP
,SIGTSTP
或其他(如SIGTTIN
或SIGTTOU
)的信号停止。
如果jobs
没有shell内置命令,可以通过以下命令列出停止的进程:
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