Как использовать 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
Другие вопросы по тегам