У меня возникла противоположная проблема, она не предупреждала о прекращении работы, когда я выходил из оболочки! Пришлось вставить shopt -s checkjobsв мой .bashrc
Сэм Уоткинс
1
нажмите Ctrl + D еще раз, это позволит вам выйти сейчас, убивая эти рабочие места в процессе
Дженс Тиммерман
Ответы:
73
Чтобы быстро убить все остановленные задания под bash, введите:
kill -9 `jobs -ps`
jobs -psперечисляет идентификаторы процессов ( -p) остановленных ( -s) заданий. kill -9 `jobs -ps`посылает сигналы SIGKILL всем им.
не работал, когда работа была "sudo su". т.е. sudo kill `jobs -p`не сработало, но явный ввод PID сработал.
user13107
14
Почему за это проголосовали так высоко? Это не правильно. Если процессы остановлены, то killтакой, как этот, ничего не сделает, так как процессы остановлены, они не будут обрабатывать SIGTERM (-15), который отправляется им по умолчанию.
Это должно сделать это, но я думаю, что он должен сначала отправить SIGTERM (-15) перед отправкой SIGKILL (-9). Поэтому, возможно, было бы лучше предложить что-то вроде «kill $ (jobs -p); sleep 3s; kill -9 $ (jobs -p)». Отправляя SIGTERM в первую очередь, задания могут выполнить чистый выход (освободить выделенные ресурсы и т. Д.).
Ремс
3
Кевин Дюк, твой ответ - тот, который сработал для меня. Я не мог голосовать, потому что у меня нет 15 репутации. kill -9 $ (jobs -p)
2
@rems За исключением того, что, как указал slm, они не получат SIGTERM, потому что их остановили.
Вы можете добавить форматирование кода для этой строки, чтобы было легче читать.
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
Если вы хотите удалить некоторые остановленные задания, но не все, попробуйте это:
Во-первых, список рабочих мест, вы получите что-то вроде этого:
Обычно, если вы получили это сообщение, вам необходимо дважды выйти из системы. Например, сначала Ctrl+Dвыдается предупреждающее сообщение, информирующее вас о остановленных заданиях, при повторном нажатии вы выйдете из системы, убивая задания. Это то же самое относится logoutи к exitкомандам.
Для того, чтобы убить их вручную, попробуйте: kill $(jobs -p).
Если вы не хотите убивать задания из текущей оболочки, вы можете удалить их из таблицы активных заданий без уничтожения с помощью disownкоманды. Например
Остановленные работы также может быть определены с помощью состояния процесса ( Tхарактер) , что означает процесс были остановлена сигналом , такие как SIGSTOP, SIGTSTPили другие (например SIGTTIN, или SIGTTOU).
Если jobsвстроенная команда оболочки недоступна, остановленные процессы могут быть перечислены с помощью следующей команды:
shopt -s checkjobs
в мой .bashrcОтветы:
Чтобы быстро убить все остановленные задания под bash, введите:
jobs -ps
перечисляет идентификаторы процессов (-p
) остановленных (-s
) заданий.kill -9 `jobs -ps`
посылает сигналы SIGKILL всем им.источник
sudo kill `jobs -p`
не сработало, но явный ввод PID сработал.kill
такой, как этот, ничего не сделает, так как процессы остановлены, они не будут обрабатывать SIGTERM (-15), который отправляется им по умолчанию.Попробуйте набрать это:
источник
Принятый ответ убил бы все задания (что достаточно в данном случае), а не только остановленные. Если вы хотите убить только остановленных, запустите:
источник
awk '/Stopped/{print $3}')
-s
аргумент о принятых фильтрах ответа только остановленные ОДНИСамый простой способ - это просто немедленно повторить попытку выхода;
bash
примет это, чтобы означать «убить все остановленные задания и выйти».источник
источник
На всякий случай это помогает кому-то другому - большинство людей здесь, потому что у них есть остановленные процессы, которые они запустили, возможно, фоновые через оболочку. Мне нужно было найти процессы с правами root, остановленные другими пользователями, для которых варианты в
jobs
команде не подходят.Немного покопавшись, я
man ps
понял это:Объяснение:
-a
флаг говорит показать все процессы, затем-o
управляет выводом, какая информация будет отображаться о каждом процессе. Я выбираюpid
,user
,cmd
(командную строку), иstate
, что является состоянием процесса .От
man ps
:так что, наконец, я передаю сообщение
grep T$
, показывающее мне все процессы с T в последнем столбце.И тогда у меня есть хороший список всех процессов от разных пользователей, которые находятся в состоянии остановки.
источник
jobs -ps
проще, чем этот ответ. При этом в этом ответе отображаются не только задания, остановленные с помощьюCtrl-Z
оболочки, но и все остановленные задания: другие оболочки, другие пользователи , включая отлаживаемые задания (например, с помощью gdb).ps -el | grep T
чтобы найти процессы в состоянии «Т».Если вы хотите удалить некоторые остановленные задания, но не все, попробуйте это:
Во-первых, список рабочих мест, вы получите что-то вроде этого:
отправить kill на остановленную работу, она будет делать только очередь, чем выводить ее на передний план, она будет прервана
источник
Обычно, если вы получили это сообщение, вам необходимо дважды выйти из системы. Например, сначала Ctrl+Dвыдается предупреждающее сообщение, информирующее вас о остановленных заданиях, при повторном нажатии вы выйдете из системы, убивая задания. Это то же самое относится
logout
и кexit
командам.Для того, чтобы убить их вручную, попробуйте:
kill $(jobs -p)
.Если вы не хотите убивать задания из текущей оболочки, вы можете удалить их из таблицы активных заданий без уничтожения с помощью
disown
команды. НапримерОстановленные работы также может быть определены с помощью состояния процесса (
T
характер) , что означает процесс были остановлена сигналом , такие какSIGSTOP
,SIGTSTP
или другие (напримерSIGTTIN
, илиSIGTTOU
).Если
jobs
встроенная команда оболочки недоступна, остановленные процессы могут быть перечислены с помощью следующей команды:Чтобы убить их всех, вы можете набрать:
Вот простой тест:
источник