Як використовувати Ctrl + C, щоб знищити всі фонові процеси, розпочаті в сценарії Bash?


9

ArchLinux (Manjaro).

Я запускаю один файл bash. Він виконує 2 процеси (команди), використовуючи &. Але коли я натискаю Ctrl+, Cщоб зупинити програму - один процес вмирає, а другий продовжує працювати.

Як зупинити обидва процеси? Або як мені написати новий сценарій для вбивства цих двох процесів?

Відповіді:


16

Оновлення: trapвимагає видалення SIGпрефікса за умови, хоча деякі оболонки підтримують його. Дивіться коментар нижче.

У новому процесі ampersand "&" виконує команду у фоновому режимі. Коли його батьківський процес (команда, яка виконує bash-скрипт у вашому випадку) закінчується, цей фоновий процес скине батьківський процес до init (процес з PID1), але не загине. Коли ви натискаєте ctrl+c, ви надсилаєте сигнал переривання на передній план, і це не вплине на фоновий процес.

Для того щоб вбити фоновий процес, вам слід скористатися killкомандою з PIDостаннім фоновим процесом, який може бути отриманий $!.

Якщо ви хочете використовувати ctrl+cдля вбивства і сценарій, і фоновий процес, ви можете зробити це:

trap 'kill $BGPID; exit' INT
sleep 1024 &    # background command
BGPID=$!
sleep 1024      # foreground command of the script

trapмодифікує обробник пастки SIGINT( trapвимагає видалення SIGпрефікса, але деякі оболонки можуть підтримувати його), так що сценарій буде вбивати процес $BGPIDперед тим, як він вийде.


Використовуючи "trap" kill $ BGPID; вихід "SIGINT", я отримую "SC2039: У POSIX sh, пріфіксація імен сигналів за допомогою" SIG "не визначена." Я думаю, що ви повинні написати пастку 'kill $ BGPID; вихід 'INT
Hettomei

@Hettomei Дякую за вклад. Я двічі перевіряю сторінку чоловіка пастки і виявляю, що те, що ви запропонували, є істинним: стандарт вимагає, щоб умова (сигнал спрацьовування) не мала префікса SIG, а підтримка префікса SIG - це розширення. Оновлена ​​оригінальна відповідь. pubs.opengroup.org/onlinepubs/009695399/utilities/trap.html
lyang

1

Програми можуть ігнорувати Ctrl+cсигнал, оскільки вони також можуть ігнорувати SIGTSTP

Ви можете спробувати Ctrl+zв більшості снарядів (не завжди, але більшу частину часу)

Є деякі сигнали, які неможливо ігнорувати процес: SIGKILL, SIGSTOP. Ви можете надіслати команду kill. Щоб знищити заморожений процес, ви повинні знайти ідентифікатор процесу (PID).
використовувати pgrep або ps, а потім вбити

 % kill -9 PID
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.