Linux: вбити фонове завдання


195

Як вбити останнє породжене фонове завдання в Linux?

Приклад:

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

18
Як це не може бути пов'язано з програмуванням? Баш-програмування - це не програмування?
flybywire

6
Це в області перекриття між SO та SU, але я думаю, що це краще підходить тут для SO. Мої критерії такого мислення полягають у тому, що якщо @flybywire робить це за сценарієм, це програмування. Якби він просто хотів це зробити з командного рядка, я б сказав, що він належить до SU.
Білл Ящірка

10
Сценарії оболонок також програмують.
клент

Відповіді:


234

Для цього в bash є спеціальна змінна:

kill $!

$! розширюється до PID останнього процесу, виконаного у фоновому режимі.


68
@ polm23; ні, ^Zне фонові завдання, вони зупиняють їх. Далі bgробиться власне «фонове зображення» (відновлює виконання у фоновому режимі), після чого $!працює як очікувалося.
falstro

Якщо припустити, що ????одна з декількох команд буде виконана після вбивства, якщо будь-яка з цих команд покладається на роботу, виконану фоновим процесом, пам'ятайте про будь-які завдання з очищення або доопрацювання, які фоновий процес може виконувати в обробці сигналів після отримання сигналу (що відловлюється). Найкраще додати wait(передуючи можливо, а syncчи навіть а sleep <n>) прямо перед першою з будь-яких таких «залежних» команд.
ак

2
Для завершення: Оскільки один% також посилається на поточну роботу, ви можете вбити зупинену роботу (^ z) за допомогою "kill%". Я використовую це майже завжди після ^ z.
t3o

Це працює лише в тому випадку, якщо у вас включений контроль роботи, який за замовчуванням увімкнено лише в інтерактивних оболонках (хоча, оскільки ви посилаєтесь на використання ctrl-z, я думаю, ви також маєте на увазі використання інтерактивної оболонки) - але це було викладений в інших відповідях тут, не впевнений, чому це "для повноти" :)
falstro

289

Ви можете вбити за номером роботи. Якщо ви поставите завдання на задньому плані, ви побачите щось на кшталт:

$ ./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 / ... а
falstro

9
Дуже корисні символи, ці %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, що стомлює.
Томаш Гандор

Чи є такий на всі робочі місця?
CMCDragonkai

3
@TomaszGandor Ось чому ви можете замінити while trueна while sleep 1. Це дасть вам коротку затримку перед перезапуском, якщо ви можете жити з цим, і якщо ви натиснете ctrl-c двічі, другий перерве сон, закінчивши його ненульовим виходом і вирвавшись з циклу.
Falstro

45

Наступна команда дає вам список усіх фонових процесів у вашому сеансі разом із pid. Потім ви можете використовувати його для вбивства процесу.

jobs -l

Приклад використання:

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

25

Це повинно знищити всі фонові процеси:

jobs -p | xargs kill -9

1
Це те, що я б використовував раніше, але kill -9 %%менше набираю :)
Томаш Гандор

4
@TomaszGandor Це знищить лише поточну роботу, тобто останню роботу, зупинену на передньому плані або розпочату у фоновому режимі. Команда у відповіді знищить ВСІ завдання.
бітек


2
skill doB

skill - це версія команди kill, яка дозволяє вибрати один або кілька процесів на основі заданих критеріїв.


0

Вам потрібен його pid ... використовуйте "ps -A", щоб знайти його.


0

це відповідь поза темою, але, для тих, хто цікавиться, це може бути цінним.

Як і у відповіді @John Kugelman,% пов'язано зі специфікацією завдання. як ефективно це знайти? використовувати меншу команду & pattern , здається, що людина використовує менший пейджер (не впевнений), в man bash type &%, тоді тип Enter покаже лише рядки, що містять '%', щоб повторно показати всі, введіть &. потім введіть.


-3

Просто використовуйте команду killall:

ім'я завдання killall

для отримання додаткової інформації та додаткових варіантів введіть "man killall".


4
Я думаю, що killall є трохи агресивним, коли у вас є легкий доступ до PID. І теж небезпечний, особливо якщо ти корінь
Дейв Фогт

3
Не дуже корисно, якщо вам довелося killall pythonабо killall java, маючи щось корисне, працюючи в інших місцях системи.
Томаш Гандор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.