Как убить последнюю заданную фоновое задание в Linux?linux: kill background task
Пример:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Как убить последнюю заданную фоновое задание в Linux?linux: kill background task
Пример:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Там специальная переменная для этого в Баш:
kill $!
$! расширяется до PID последнего процесса, выполняемого в фоновом режиме.
Это не работает для заданий, созданных с помощью '^ Z'. – polm23
@ polm23; нет, '^ Z' не выполняет фоновые задания, а останавливает их. Последующий 'bg' выполняет фактическое« backgrounding »(возобновляет выполнение в фоновом режиме), а после этого' $! 'Работает так, как ожидалось. – falstro
Предполагая, что '????' означает выполнение одной или нескольких команд после уничтожения, если какая-либо из этих команд опирается на работу, выполняемую фоновым процессом, помните о любых задачах по очистке или завершению, которые выполняются фоновым процессом может выполнять в обработчике сигнала после приема сигнала (trappable). Лучше всего добавить 'wait' (за которым следует, возможно,' sync' или даже 'sleep
Вам нужно его PID ... использовать "PS -A", чтобы найти его.
Просто используйте команду killall:
killall TaskName
для получения дополнительной информации и более продвинутые варианты, типа "человек killall".
Я думаю, что killall немного агрессивен, когда у вас действительно есть легкий доступ к PID. И опасно, особенно если вы root –
Не очень полезно, если вам нужно было «killall python» или «killall java», имея при этом что-то полезное для работы в системе. –
skill doB
skill
версия команды глушения, который позволяет выбрать один или несколько процессов на основе заданного критерия.
Вы можете убить по номеру задания. Когда вы поставили перед собой задачу в фоновом режиме, вы увидите что-то вроде:
$ ./script &
[1] 35341
Это [1]
это количество рабочих мест и может ссылаться как:
$ kill %1
$ kill %% # Most recent background job
Чтобы увидеть список номеров заданий Используйте jobs
команда. Больше от man bash
:
Существует несколько способов обращения к заданию в оболочке. Символ
%
вводит имя задания. Номер заданияn
может быть%n
. Задание также может ссылаться на использование префикса имени, используемого для его запуска, или с помощью подстроки, которая в командной строке отображается . Например,%ce
относится к остановленной задачеce
. Если префикс соответствует нескольким заданиям, bash сообщает об ошибке. С другой стороны, с помощью%?ce
ссылается на любое задание, содержащее строкуce
в командной строке. Если подстрока соответствует нескольким заданиям, bash сообщает об ошибке. Символы%%
и%+
относятся к представлению оболочки о текущем задании, которое является последним заданием, которое было остановлено, когда оно было на переднем плане или было запущено в фоновом режиме. Предыдущее задание может содержать с использованием%-
. На выходе, относящемся к заданиям (например, на выходе команды заданий), текущее задание всегда с флагом+
, а предыдущее задание --
. Один%
(без соответствующей спецификации задания) также относится к текущему заданию .
Для записи я считаю, что это работает только в том случае, если управление заданиями включено. Хотя я думаю, что вы можете включить его в скриптах ('set -m'), он предназначен для интерактивного использования. См. Http://stackoverflow.com/questions/690266/why-cant-i-use-job-control-in-a-bash-script, а также – falstro
Очень полезные символы, эти '% 1' и' %% '- особенно. Некоторые вещи не умирают на Ctrl-C, поэтому вам нужно Ctrl-Z их, а затем «kill -9 %%». Одним из примеров, когда я нашел его полезным, является: 'while true; сделать mplayer <некоторое нестабильное онлайн-радио>; date >> restarts.log; done' - Ctrl-C просто приведет вас к следующей итерации цикла. Раньше мне приходилось делать 'ps' или, возможно,' jobs -l', а затем повторно вводить PID, что является утомительным. –
Есть ли один для всех рабочих мест? – CMCDragonkai
Следующая команда дает вам список всех фоновых процессов в вашей сессии, а также pid. Затем вы можете использовать его, чтобы убить процесс.Использование
jobs -l
Примера:
$ sleep 300 &
$ jobs -l
[1]+ 31139 Running sleep 300 &
$ kill 31139
Это должно убить все фоновые процессы:
jobs -p | xargs kill -9
Это то, что я использовал раньше, но 'kill -9 %%' меньше набирает :) –
@TomaszGandor Это убьет только текущее задание, т. Е. Последнее задание остановилось на переднем плане или началось в фоновом режиме. Команда в ответе уничтожит ВСЕ задания. – bitek
[не убивать -9] (http://unix.stackexchange.com/questions/8916/when-should-i-not-kill-9-a-process) – lesmana
это из темы ответа, но, для тех, кому интересно, это может быть ценным ,
Как и в ответе @John Kugelman,% связано со спецификацией задания. как эффективно найти это? использование отсутствует & шаблон команда, кажется man использование нет пейджер (не тот обязательно), в man bash type &% then type Enter будет отображать только строки, содержащие «%», чтобы просмотреть все, введите &. затем Enter.
Как это не связано с программированием? Программирование Bash - это не программирование? – flybywire
Принадлежит суперпользователю ИМХО. – Hasturkun
Это в области перекрытия между SO и SU, но я думаю, что он лучше подходит для SO. Мои критерии для размышлений таким образом: если @flybywire делает это в скрипте, это программирование. Если бы он просто хотел сделать это из командной строки, я бы сказал, что он принадлежит SU. –