Когда я пытаюсь выйти из моего сервера Linux, я получаю сообщение:
Есть остановленные работы.
: Есть ли одна команда, чтобы убить их?
shopt -s checkjobs
в мой .bashrc
Когда я пытаюсь выйти из моего сервера Linux, я получаю сообщение:
Есть остановленные работы.
: Есть ли одна команда, чтобы убить их?
shopt -s checkjobs
в мой .bashrc
Ответы:
Чтобы быстро убить все остановленные задания под bash, введите:
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
чтобы найти процессы в состоянии «Т».
Если вы хотите удалить некоторые остановленные задания, но не все, попробуйте это:
Во-первых, список рабочих мест, вы получите что-то вроде этого:
$ 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
Обычно, если вы получили это сообщение, вам необходимо дважды выйти из системы. Например, сначала 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