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


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

Завершены рабочие места.

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


79
2018-02-25 10:07


Источник


Дополнительные примеры в Q & A U & L: unix.stackexchange.com/questions/124428/... - slm
Теперь у меня была противоположная проблема, она не предупреждала о прекращенных заданиях, когда я выхожу из оболочки! Пришлось положить shopt -s checkjobs в моем .bashrc - Sam Watkins
снова нажмите ctrl + d, он позволит вам выйти из игры, убив эти задания в процессе - Jens Timmerman


Ответы:


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

kill `jobs -ps`

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


69
2018-02-25 10:15



-1 для "kill Jobs" - Tibor
не работал, когда работа была «судо су». то есть sudo kill `jobs -p` не работает, но явно набирает PID. - user13107
Почему это так высоко поднято? Это не правильно. Если процессы остановлены, то kill такие как это ничего не будут делать, поскольку процессы будут остановлены, они не будут обрабатывать SIGTERM (-15), который отправляется им по умолчанию. - slm
kill -9 сделает трюк. - Blossoming_Flower
Очевидно, неправильный ответ! - mrangry777


Попробуйте ввести следующее:

kill -9 $(jobs -p)

73
2018-02-25 10:14



Это должно сделать это, но я думаю, что он должен отправить сначала SIGTERM (-15) перед отправкой SIGKILL (-9). Поэтому, возможно, предложите что-то вроде «kill $ (jobs -p); sleep 3s; kill -9 $ (jobs -p)» будет лучше. При отправке SIGTERM сначала задания могут выполнять чистый выход (освобождение выделенных ресурсов и т. Д.). - rems
Кевин Дюк, твой ответ - тот, который работал на меня. Я не мог голосовать, потому что у меня нет репутации 15. kill -9 $ (jobs -p)
@rems Кроме того, как указывает slm, они не получат SIGTERM, потому что они остановлены. - Paul Gear


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

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

16
2018-03-08 18:04



grep / cut можно объединить в одну команду awk: awk '/Stopped/{print $3}') - laebshade
-s аргумент о принятом ответе фильтрует только остановленные - 79E09796


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


12
2018-03-08 18:13



Это отправит HUP, который не обязательно останавливает какие-либо задания. - Stephen Niedzielski


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

7
2018-02-26 10:22



вы можете добавить форматирование кода для этой строки, чтобы было легче читать. - drcelus
Можете ли вы снова взглянуть на свое форматирование - используйте четыре пробела в начале строки, чтобы пометить блок как код (а не использовать обратную ссылку). Сейчас неясно, используете ли вы обратные элементы в своем коде или пытаетесь отобразить код с помощью обратных ссылок. - dunxd
Форматирование в порядке. мы должны передать задания -p, используя обратные ссылки, которые он не будет рассматривать как команду, и он выдает ошибку. - monu


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

Во-первых, перечислите задания, вы получите что-то вроде этого:

$ jobs -l

[2]   4813 Stopped                 ./parse < call.txt
[3]-  4819 Stopped                 ./parse < call.txt

отправить убить на остановленное задание, он ничего не сделает, кроме очереди чем привести его на передний план, он прекратится

$ fg %2
./parse < call.txt
Terminated

$ jobs -l
[3]-  4819 Stopped                 ./parse < call.txt

4
2018-05-30 04:16





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

4
2018-02-19 20:46





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

4
2018-02-26 06:47



Чтобы получить приостановленные задания, прикрепленные к текущей оболочке, jobs -ps проще, чем этот ответ. При этом в этом ответе не отображаются только прекращенные работы Ctrl-Z в оболочке, но все остановленные задания: другие оболочки, другие пользователи, включая отлаживаемые задания (например, gdb). - Stéphane Gourichon