Как убить последнюю порожденную фоновую задачу в linux?
Пример:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Как убить последнюю порожденную фоновую задачу в linux?
Пример:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Ответы:
Для этого в bash есть специальная переменная:
kill $!
$! расширяется до PID последнего процесса, выполняемого в фоновом режиме.
^Z
не фоновые задания, это их останавливает. Последующее bg
выполняет фактическое «фоновое изображение» (возобновляет выполнение в фоновом режиме), и после этого $!
работает как ожидалось.
????
одна или несколько команд выполняются после уничтожения, если любая из этих команд полагается на работу, выполняемую фоновым процессом, помните о любых задачах очистки или завершения, которые фоновый процесс может выполнить в обработчике сигнала после получение (trappable) сигнала. Лучше всего добавить wait
(возможно, после sync
или даже sleep <n>
) прямо перед первой из таких «зависимых» команд.
Вы можете убить по номеру работы. Когда вы поставите задачу в фоновом режиме, вы увидите что-то вроде:
$ ./script &
[1] 35341
Это [1]
номер задания, на который можно ссылаться следующим образом:
$ kill %1
$ kill %% # Most recent background job
Чтобы увидеть список рабочих номеров, используйте jobs
команду. Больше от man bash
:
Существует несколько способов ссылки на задание в оболочке. Персонаж
%
вводит имя работы. Номер заданияn
может упоминаться как%n
. Задание также может упоминаться с использованием префикса имени, использованного для его запуска, или с использованием подстроки, которая появляется в его командной строке. Например,%ce
относится к остановленнойce
работе. Если префикс соответствует более чем одному заданию, bash сообщает об ошибке. Использование%?ce
, с другой стороны, относится к любому заданию, содержащему строкуce
в его командной строке. Если подстрока соответствует более чем одному заданию, bash сообщает об ошибке. Символы%%
и%+
обратитесь к понятию оболочки текущего задания, которое является последним заданием, остановленным, когда оно находилось на переднем плане или началось в фоновом режиме. На предыдущую работу можно ссылаться с помощью%-
. В выводе, относящемся к заданиям (например, выводе команды jobs), текущее задание всегда помечается знаком a+
, а предыдущее задание --
. Сингл%
(без сопровождающей спецификации работы) также относится к текущей работе.
set -m
), он предназначен для интерактивного использования. См stackoverflow.com/questions/690266/... , а также
%1
и %%
- особенно. Некоторые вещи не умирают на Ctrl-C, поэтому вам нужно Ctrl-Z их, а затем kill -9 %%
. Один пример, где я нашел это полезным: while true; do mplayer <some unstable online radio>; date >> restarts.log; done
- Ctrl-C просто приведет вас к следующей итерации цикла. Прежде чем я должен был сделать ps
или, может быть jobs -l
, а затем повторно введите PID, что утомительно.
while true
наwhile sleep 1
. Это даст вам небольшую задержку перед перезапуском, если вы сможете жить с этим, и если вы дважды нажмете ctrl-c, второй прервет сон, завершив его ненулевым выходом и выходом из цикла.
Это должно убить все фоновые процессы:
jobs -p | xargs kill -9
kill -9 %%
меньше печатать :)
Это неуместный ответ, но для тех, кто заинтересован, он может быть ценным.
Как и в ответе @John Kugelman,% относится к спецификации работы. как эффективно это найти? используйте команду less & & pattern , кажется, что man использует меньше пейджер (не уверен), в man bash введите &%, затем введите Enter, чтобы отобразить только строки, содержащие '%', для повторного показа всего введите &. затем введите.
Просто используйте команду killall:
killall имя задачи
для получения дополнительной информации и дополнительных параметров введите «man killall».
killall python
или killall java
, когда что-то полезное работает в системе.