Як я можу вбити всі припинені роботи?


91

Коли я намагаюся вийти зі свого сервера Linux, я отримую повідомлення:

Зупинені робочі місця.

: Чи є одна команда вбити цих?


Додаткові приклади в питаннях U&L Q&A: unix.stackexchange.com/questions/124428/…
slm

Зараз у мене була протилежна проблема, вона б не попереджала про припинені роботи, коли я вийшов з оболонки! Довелося помістити shopt -s checkjobsв мій .bashrc
Сем Уоткінс

1
знову натисніть ctrl + d, це дозволить вам вийти вже зараз, вбиваючи ці завдання в процесі
Jens Timmerman

Відповіді:


73

Щоб швидко знищити всі зупинені завдання під ударом, введіть:

kill -9 `jobs -ps`

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


22
-1 за "kill Jobs"

1
не працювало, коли робота була "sudo su". тобто не sudo kill `jobs -p`працював, але явно набрав PID.
користувач13107

14
Чому це наголос настільки високо? Це неправильно. Якщо процеси зупиняються, то killтакі, як це, нічого не робитимуть, оскільки процеси зупинені, вони не оброблять SIGTERM (-15), який надсилається їм за замовчуванням.
slm

6
убий -9 зробить трюк.
тимчасово

84

Спробуйте ввести це:

kill -9 $(jobs -p)

9
Це повинно це зробити, але я думаю, що він повинен надіслати СИГЕРМ (-15) перш ніж надсилати SIGKILL (-9). Тож можливо запропонувати щось на кшталт "убити $ (вакансії-р); спати 3;; вбити -9 $ (робочі місця -p)" було б краще. Перш ніж надіслати завдання SIGTERM, завдання можуть зробити чистий вихід (звільнення виділених ресурсів тощо).
rems

3
Кевін Герцог, ваша відповідь - це те, що працювало на мене. Я не міг проголосувати, бо не маю 15 репутації. kill -9 $ (jobs -p)

2
@rems За винятком випадків, як зазначає slm, вони не отримають SIGTERM, оскільки їх зупиняють.
Пол Гір


Тоді, як боротися зі zsh?
fx-kirin

16

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

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

grep / cut можна поєднувати в одній команді awk: awk '/Stopped/{print $3}')
маячка

2
-sаргумент про прийнятих фільтрах відповіді тільки зупинені ОДНІ
79E09796

12

Найпростіший спосіб - це просто негайно повторити спробу виходу; bashбуде вважати, що це означає "вбити всі припинені робочі місця та вийти".


4
Це надішле HUP, який не обов'язково зупиняє будь-які завдання.
Stephen Niedzielski

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

2
ви можете додати форматування коду для цього рядка, щоб полегшити його читання.
drcelus

Чи можете ви знову переглянути своє форматування - використовуйте чотири пробіли на початку рядка, щоб позначити блок як код (а не використовувати зворотний підбір). Зараз не зрозуміло, чи використовуєте ви в коді задні посилання чи намагаєтесь відобразити код за допомогою зворотних посилань.
dunxd

Форматування добре. ми повинні передавати завдання -p, використовуючи backticks, інакше це не буде розглядатися як команда, і це призведе до помилки.
понеділок

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щоб знайти процеси в стані "T".
dr0i

4

Якщо ви хочете видалити деякі зупинені завдання, але не всі, спробуйте:

По-перше, перерахуйте завдання, ви отримаєте щось подібне:

$ 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

Як правило, якщо ви отримали це повідомлення, вам потрібно вийти двічі. Наприклад, спочатку 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.