Как я могу убить все остановленные работы?
Когда я пытаюсь выйти из моего сервера Linux, я получаю сообщение:
Есть остановленные работы.
: Есть ли одна команда, чтобы убить их?
8 ответов
Чтобы быстро убить все задания, запущенные в bash, введите:
kill `jobs -ps`
jobs -ps
список ID процесса остановленных заданий. kill `jobs -ps`
отправить сигнал TERM для всех остановленных заданий.
Принятый ответ убил бы все задания (что достаточно в данном случае), а не только остановленные. Если вы хотите убить только остановленных, запустите:
kill $(jobs -l | grep Stopped | cut -d' ' -f3)
Самый простой способ - это просто немедленно повторить попытку выхода; bash
примет это, чтобы означать "убить все остановленные задания и выйти".
На всякий случай это помогает кому-то другому - большинство людей здесь, потому что у них есть остановленные процессы, которые они запустили, возможно, фоновые через оболочку. Мне нужно было найти процессы, как root, остановленные другими пользователями, для которых варианты на 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
Обычно, если вы получили это сообщение, вам необходимо дважды выйти из системы. Например, сначала 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
Если вы хотите удалить некоторые остановленные задания, но не все, попробуйте это:
Во-первых, список рабочих мест, вы получите что-то вроде этого:
$ 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