Назад | Перейти на главную страницу

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

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

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

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

Попробуйте ввести это:

kill -9 $(jobs -p)

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

kill -9 `jobs -ps`

jobs -ps перечисляет идентификаторы процессов (-p) остановленных (-s) рабочие места.
kill -9 `jobs -ps` посылает всем им сигналы SIGKILL.

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

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

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

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

Обычно, если вы получили это сообщение, вам нужно дважды выйти из системы. Например. первый 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

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

Если вы хотите удалить некоторые остановленные задания, но не все, попробуйте следующее:

Сначала перечислите вакансии, вы получите что-то вроде этого:

$ 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