Как я могу убить все остановленные работы?

Когда я пытаюсь выйти из моего сервера Linux, я получаю сообщение:

Есть остановленные работы.

: Есть ли одна команда, чтобы убить их?

8 ответов

Решение

Чтобы быстро убить все задания, запущенные в bash, введите:

kill `jobs -ps`

jobs -ps список ID процесса остановленных заданий. kill `jobs -ps` отправить сигнал TERM для всех остановленных заданий.

Попробуйте набрать это:

kill -9 $(jobs -p)

Принятый ответ убил бы все задания (что достаточно в данном случае), а не только остановленные. Если вы хотите убить только остановленных, запустите:

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

Самый простой способ - это просто немедленно повторить попытку выхода; bash примет это, чтобы означать "убить все остановленные задания и выйти".

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

На всякий случай это помогает кому-то другому - большинство людей здесь, потому что у них есть остановленные процессы, которые они запустили, возможно, фоновые через оболочку. Мне нужно было найти процессы, как 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
Другие вопросы по тегам