Как убить последнюю порожденную фоновую задачу в 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, когда что-то полезное работает в системе.