Коли я намагаюся вийти зі свого сервера Linux, я отримую повідомлення:
Зупинені робочі місця.
: Чи є одна команда вбити цих?
shopt -s checkjobs
в мій .bashrc
Коли я намагаюся вийти зі свого сервера Linux, я отримую повідомлення:
Зупинені робочі місця.
: Чи є одна команда вбити цих?
shopt -s checkjobs
в мій .bashrc
Відповіді:
Щоб швидко знищити всі зупинені завдання під ударом, введіть:
kill -9 `jobs -ps`
jobs -ps
перелічує ідентифікатори процесу ( -p
) зупинених ( -s
) завдань.
kill -9 `jobs -ps`
посилає сигнали SIGKILL всім їм.
sudo kill `jobs -p`
працював, але явно набрав PID.
kill
такі, як це, нічого не робитимуть, оскільки процеси зупинені, вони не оброблять SIGTERM (-15), який надсилається їм за замовчуванням.
Спробуйте ввести це:
kill -9 $(jobs -p)
Прийнята відповідь знищить усі робочі місця (що в цьому випадку достатньо), а не лише зупинені. Якщо ви хочете вбити лише зупинених, запустіть:
kill $(jobs -l | grep Stopped | cut -d' ' -f3)
awk '/Stopped/{print $3}')
-s
аргумент про прийнятих фільтрах відповіді тільки зупинені ОДНІ
Найпростіший спосіб - це просто негайно повторити спробу виходу; bash
буде вважати, що це означає "вбити всі припинені робочі місця та вийти".
for x in `jobs -p` ; do kill -9 $x ; done
Про всяк випадок це допомагає комусь іншому - більшість людей тут, тому що у них є зупинені процеси, які вони розпочалися, можливо, фонові зображення через оболонку. Мені потрібно було знайти процеси, як 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".
Якщо ви хочете видалити деякі зупинені завдання, але не всі, спробуйте:
По-перше, перерахуйте завдання, ви отримаєте щось подібне:
$ 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
Як правило, якщо ви отримали це повідомлення, вам потрібно вийти двічі. Наприклад, спочатку 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