5

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

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

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

2 ответа2

9

Амперсанд "&" запускает команду в фоновом режиме в новом процессе. Когда его родительский процесс (команда, которая запускает скрипт 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 изменяет обработчик trap-сообщения SIGINT чтобы скрипт завершал процесс с $BGPID до его выхода.

1

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

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

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

 % kill -9 PID

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .