Как использовать Ctrl + C, чтобы убить все фоновые процессы, запущенные в скрипте Bash?

4447
Ievgen

ArchLinux (Манджаро).

Я запускаю один файл Bash. Он запускает 2 процесса (команды), используя &. Но когда я нажимаю Ctrl+, Cчтобы остановить программу - один процесс умирает, а другой продолжает работать.

Как мне остановить оба процесса? Или как мне написать новый скрипт для уничтожения этих двух процессов?

5

2 ответа на вопрос

7
lyang

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

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

Если вы хотите использовать ctrl+cдля уничтожения как сценария, так и фонового процесса, вы можете сделать это:

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

trapизменяет обработчик ловушек SIGINTтак, чтобы скрипт убивал процесс $BGPIDдо его выхода.

1
Romano

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

Вы можете попробовать Ctrl+zв большинстве оболочек (не всегда, но большую часть времени)

Есть некоторые сигналы, которые не могут быть проигнорированы процессом: SIGKILL, SIGSTOP. Вы можете отправить команду убить. Чтобы убить ваш замороженный процесс, вы должны найти идентификатор процесса (PID).
используйте pgrep или ps и затем убейте его

 % kill -9 PID 

Похожие вопросы