When I try to exit from my Linux server I get the message:
There are stopped jobs.
: Is there a single command to kill these?
To quickly kill all the stopped jobs under the bash, enter:
kill -9 `jobs -ps`
jobs -ps
lists the process IDs (-p
) of the stopped (-s
) jobs.
kill -9 `jobs -ps`
sends SIGKILL signals to all of them.
sudo kill `jobs -p`
didnt work but explicitly typing PID did.
Commented
Oct 27, 2012 at 18:12
kill
such as this will do nothing, since the processes are stopped, they won't process the SIGTERM (-15) that is sent to them by default.
Try typing this:
kill -9 $(jobs -p)
The accepted answer would kill all jobs (which is sufficient in this case) and not merely the stopped ones. Should you want to kill only the Stopped ones, run:
kill $(jobs -l | grep Stopped | cut -d' ' -f3)
awk '/Stopped/{print $3}')
Commented
Oct 20, 2015 at 13:35
-s
argument on the accepted answer filters just the stopped ones
The easiest way is actually to simply immediately retry the exit; bash
will take that to mean "kill all stopped jobs and exit".
for x in `jobs -p` ; do kill -9 $x ; done
Normally if you got that message, you need to logout twice. E.g. first Ctrl+D gives you the warning message to inform you about stopped jobs, pressing for the second time will log you out killing the jobs. This the same applies to logout
and exit
commands.
To kill them manually, try: kill $(jobs -p)
.
If you don't want to kill jobs from your current shell, you can remove them from the table of active jobs without killing by using disown
command. E.g.
$ sleep 1000 &
[1] 19404
$ jobs
[1]+ Running sleep 1000 &
$ disown
Stopped jobs also can be determined by the state of the process (T
character) which means the process was stopped by signal such as SIGSTOP
, SIGTSTP
or other (like SIGTTIN
, or SIGTTOU
).
In case when jobs
a shell builtin command is not available, stopped processes can be listed by the following command:
ps wuax | awk '$8 ~ "T"'
To kill them all, you can basically type:
kill -9 $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')
Here is a simple test:
$ 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
Just in case this helps someone else -- most people are here because they have some stopped processes that they started, backgrounded via the shell maybe. I needed to find processes, as root, stopped by other users, for which variants on the jobs
command won't do.
A bit of digging around with man ps
got me to this:
ps -a -o pid,user,cmd,state | grep 'T$'
Explanation: the -a
flag says show all processes, then -o
controls output, what info will be shown about each process. I'm choosing pid
, user
, cmd
(the command line), and state
, which is the process state.
From 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
so finally I pipe it to grep T$
which says, show me all the processes that have T in the last column.
And then I have a nice list of all the processes from different users that are in the stopped state.
$ 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
is simpler than this answer. That being said, this answer doesn't show only jobs stopped via Ctrl-Z
in a shell, but all stopped jobs: other shells, other users, including jobs being debugged (e.g. by gdb).
Commented
May 25, 2018 at 7:50
ps -el | grep T
to find the processes in state 'T'.
If you want to remove some stopped jobs but not all, try this:
First, list jobs, you will get something like this:
$ jobs -l
[2] 4813 Stopped ./parse < call.txt
[3]- 4819 Stopped ./parse < call.txt
send kill to a stopped job, it will do nothing but queue than bring it in in foreground, it will terminate
$ fg %2
./parse < call.txt
Terminated
$ jobs -l
[3]- 4819 Stopped ./parse < call.txt
shopt -s checkjobs
in my .bashrc