2009-10-26 2 views
153

Как убить последнюю заданную фоновое задание в Linux?linux: kill background task

Пример:

doSomething 
doAnotherThing 
doB & 
doC 
doD 
#kill doB 
???? 
+16

Как это не связано с программированием? Программирование Bash - это не программирование? – flybywire

+3

Принадлежит суперпользователю ИМХО. – Hasturkun

+5

Это в области перекрытия между SO и SU, но я думаю, что он лучше подходит для SO. Мои критерии для размышлений таким образом: если @flybywire делает это в скрипте, это программирование. Если бы он просто хотел сделать это из командной строки, я бы сказал, что он принадлежит SU. –

ответ

184

Там специальная переменная для этого в Баш:

kill $! 

$! расширяется до PID последнего процесса, выполняемого в фоновом режиме.

+16

Это не работает для заданий, созданных с помощью '^ Z'. – polm23

+56

@ polm23; нет, '^ Z' не выполняет фоновые задания, а останавливает их. Последующий 'bg' выполняет фактическое« backgrounding »(возобновляет выполнение в фоновом режиме), а после этого' $! 'Работает так, как ожидалось. – falstro

+0

Предполагая, что '????' означает выполнение одной или нескольких команд после уничтожения, если какая-либо из этих команд опирается на работу, выполняемую фоновым процессом, помните о любых задачах по очистке или завершению, которые выполняются фоновым процессом может выполнять в обработчике сигнала после приема сигнала (trappable). Лучше всего добавить 'wait' (за которым следует, возможно,' sync' или даже 'sleep ') прямо перед первой из таких «зависимых» команд. – ack

1

Вам нужно его PID ... использовать "PS -A", чтобы найти его.

-1

Просто используйте команду killall:

killall TaskName

для получения дополнительной информации и более продвинутые варианты, типа "человек killall".

+4

Я думаю, что killall немного агрессивен, когда у вас действительно есть легкий доступ к PID. И опасно, особенно если вы root –

+2

Не очень полезно, если вам нужно было «killall python» или «killall java», имея при этом что-то полезное для работы в системе. –

2
skill doB 

skill версия команды глушения, который позволяет выбрать один или несколько процессов на основе заданного критерия.

247

Вы можете убить по номеру задания. Когда вы поставили перед собой задачу в фоновом режиме, вы увидите что-то вроде:

$ ./script & 
[1] 35341 

Это [1] это количество рабочих мест и может ссылаться как:

$ kill %1 
$ kill %% # Most recent background job 

Чтобы увидеть список номеров заданий Используйте jobs команда. Больше от man bash:

Существует несколько способов обращения к заданию в оболочке. Символ % вводит имя задания. Номер задания n может быть %n. Задание также может ссылаться на использование префикса имени, используемого для его запуска, или с помощью подстроки, которая в командной строке отображается . Например, %ce относится к остановленной задаче ce. Если префикс соответствует нескольким заданиям, bash сообщает об ошибке. С другой стороны, с помощью %?ce ссылается на любое задание, содержащее строку ce в командной строке. Если подстрока соответствует нескольким заданиям, bash сообщает об ошибке. Символы %% и %+ относятся к представлению оболочки о текущем задании, которое является последним заданием, которое было остановлено, когда оно было на переднем плане или было запущено в фоновом режиме. Предыдущее задание может содержать с использованием %-. На выходе, относящемся к заданиям (например, на выходе команды заданий), текущее задание всегда с флагом +, а предыдущее задание - -. Один % (без соответствующей спецификации задания) также относится к текущему заданию .

+0

Для записи я считаю, что это работает только в том случае, если управление заданиями включено. Хотя я думаю, что вы можете включить его в скриптах ('set -m'), он предназначен для интерактивного использования. См. Http://stackoverflow.com/questions/690266/why-cant-i-use-job-control-in-a-bash-script, а также – falstro

+6

Очень полезные символы, эти '% 1' и' %% '- особенно. Некоторые вещи не умирают на Ctrl-C, поэтому вам нужно Ctrl-Z их, а затем «kill -9 %%». Одним из примеров, когда я нашел его полезным, является: 'while true; сделать mplayer <некоторое нестабильное онлайн-радио>; date >> restarts.log; done' - Ctrl-C просто приведет вас к следующей итерации цикла. Раньше мне приходилось делать 'ps' или, возможно,' jobs -l', а затем повторно вводить PID, что является утомительным. –

+0

Есть ли один для всех рабочих мест? – CMCDragonkai

40

Следующая команда дает вам список всех фоновых процессов в вашей сессии, а также pid. Затем вы можете использовать его, чтобы убить процесс.Использование

jobs -l 

Примера:

$ sleep 300 & 
$ jobs -l 
[1]+ 31139 Running     sleep 300 & 
$ kill 31139 
20

Это должно убить все фоновые процессы:

jobs -p | xargs kill -9 
+1

Это то, что я использовал раньше, но 'kill -9 %%' меньше набирает :) –

+4

@TomaszGandor Это убьет только текущее задание, т. Е. Последнее задание остановилось на переднем плане или началось в фоновом режиме. Команда в ответе уничтожит ВСЕ задания. – bitek

+3

[не убивать -9] (http://unix.stackexchange.com/questions/8916/when-should-i-not-kill-9-a-process) – lesmana

0

это из темы ответа, но, для тех, кому интересно, это может быть ценным ,

Как и в ответе @John Kugelman,% связано со спецификацией задания. как эффективно найти это? использование отсутствует & шаблон команда, кажется man использование нет пейджер (не тот обязательно), в man bash type &% then type Enter будет отображать только строки, содержащие «%», чтобы просмотреть все, введите &. затем Enter.

Смежные вопросы