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


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.