Как использовать Ctrl+C, чтобы убить все фоновые процессы, запущенные в скрипте Bash?
ArchLinux (Манджаро).
Я запускаю один файл Bash. Он запускает 2 процесса (команды), используя &
, Но когда я нажимаю Ctrl+C, чтобы остановить программу - один процесс умирает, а другой продолжает работать.
Как мне остановить оба процесса? Или как мне написать новый скрипт для уничтожения этих двух процессов?
2 ответа
Амперсанд "&" запускает команду в фоновом режиме в новом процессе. Когда его родительский процесс (команда, запускающая сценарий bash в вашем случае) завершается, этот фоновый процесс сбрасывает свой родительский процесс в init (процесс с PID
1), но не умрет. Когда вы нажимаете 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
прежде чем он выйдет.
Программы могут игнорировать Ctrl+c
сигнал, так как они могут игнорировать SIGTSTP, а также
Ты можешь попробовать Ctrl+z
в большинстве снарядов (не всегда, но в большинстве случаев)
Есть некоторые сигналы, которые нельзя игнорировать процессом: SIGKILL, SIGSTOP. Вы можете отправить команду убить. Чтобы убить ваш замороженный процесс, вы должны найти идентификатор процесса (PID).
используйте pgrep или ps и затем убейте его
% kill -9 PID