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


91

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

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

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


Дополнительные примеры в этой одной U & L Q & A: unix.stackexchange.com/questions/124428/...
— ОДС

У меня возникла противоположная проблема, она не предупреждала о прекращении работы, когда я выходил из оболочки! Пришлось вставить shopt -s checkjobsв мой .bashrc
— Сэм Уоткинс

1
нажмите Ctrl + D еще раз, это позволит вам выйти сейчас, убивая эти рабочие места в процессе
— Дженс Тиммерман

Ответы:


73

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

kill -9 `jobs -ps`

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


22
-1 за "убить Джобса"

1
не работал, когда работа была "sudo su". т.е. sudo kill `jobs -p`не сработало, но явный ввод PID сработал.
— user13107

14
Почему за это проголосовали так высоко? Это не правильно. Если процессы остановлены, то killтакой, как этот, ничего не сделает, так как процессы остановлены, они не будут обрабатывать SIGTERM (-15), который отправляется им по умолчанию.
— SLM

6
убить -9 добьется цели.
— 12.10.14

84

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

kill -9 $(jobs -p)

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

3
Кевин Дюк, твой ответ - тот, который сработал для меня. Я не мог голосовать, потому что у меня нет 15 репутации. kill -9 $ (jobs -p)

2
@rems За исключением того, что, как указал slm, они не получат SIGTERM, потому что их остановили.
— Пол Гир


Тогда как бороться с Zsh?
— FX-Кирин

16

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

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

grep / cut можно объединить в одну команду awk: awk '/Stopped/{print $3}')
— laebshade

2
-sаргумент о принятых фильтрах ответа только остановленные ОДНИ
— 79E09796

12

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


4
Это отправит HUP, который не обязательно останавливает работу.
— Стивен Недзельски

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

2
Вы можете добавить форматирование кода для этой строки, чтобы было легче читать.
— drcelus

Можете ли вы взглянуть на свое форматирование снова - используйте четыре пробела в начале строки, чтобы пометить блок как код (вместо использования backtick). В настоящее время неясно, используете ли вы обратные ссылки в своем коде или пытаетесь отобразить код с помощью обратных кодов.
— dunxd

Форматирование в порядке. мы должны передать задания -p с помощью обратных кавычек, иначе это не будет рассматриваться как команда, и это вызовет ошибку.
— памятник

5

На всякий случай это помогает кому-то другому - большинство людей здесь, потому что у них есть остановленные процессы, которые они запустили, возможно, фоновые через оболочку. Мне нужно было найти процессы с правами 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 -psпроще, чем этот ответ. При этом в этом ответе отображаются не только задания, остановленные с помощью Ctrl-Zоболочки, но и все остановленные задания: другие оболочки, другие пользователи , включая отлаживаемые задания (например, с помощью gdb).
— Стефан Гурихон

Для меня лучший ответ, но не совсем рабочий. Мне пришлось использовать, ps -el | grep Tчтобы найти процессы в состоянии «Т».
— Dr0i

4

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

Во-первых, список рабочих мест, вы получите что-то вроде этого:

$ 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

4

Обычно, если вы получили это сообщение, вам необходимо дважды выйти из системы. Например, сначала 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.