Як вбити останнє породжене фонове завдання в 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
, маючи щось корисне, працюючи в інших місцях системи.