Як вбити останнє породжене фонове завдання в Linux?
Приклад:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Як вбити останнє породжене фонове завдання в Linux?
Приклад:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Відповіді:
Для цього в bash є спеціальна змінна:
kill $!
$! розширюється до PID останнього процесу, виконаного у фоновому режимі.
^Zне фонові завдання, вони зупиняють їх. Далі bgробиться власне «фонове зображення» (відновлює виконання у фоновому режимі), після чого $!працює як очікувалося.
????одна з декількох команд буде виконана після вбивства, якщо будь-яка з цих команд покладається на роботу, виконану фоновим процесом, пам'ятайте про будь-які завдання з очищення або доопрацювання, які фоновий процес може виконувати в обробці сигналів після отримання сигналу (що відловлюється). Найкраще додати 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 повідомляє про помилку. Символи%%та%+посилаються на поняття оболонки про поточне завдання, яке є останнім завданням, зупиненим, коли воно було на передньому плані або розпочато у фоновому режимі. На попереднє завдання можна посилатися за допомогою%-. У висновку, що стосується завдань (наприклад, вихід команди команд), поточне завдання завжди позначено символом a+, а попереднє завдання - 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,% пов'язано зі специфікацією завдання. як ефективно це знайти? використовувати меншу команду & pattern , здається, що людина використовує менший пейджер (не впевнений), в man bash type &%, тоді тип Enter покаже лише рядки, що містять '%', щоб повторно показати всі, введіть &. потім введіть.
Просто використовуйте команду killall:
ім'я завдання killall
для отримання додаткової інформації та додаткових варіантів введіть "man killall".
killall pythonабо killall java, маючи щось корисне, працюючи в інших місцях системи.