Назад | Перейти на главную страницу

Как написать сценарий bash, который перехватывает SIGTERM и немедленно убивает процесс и все подпроцессы

У меня есть такой сценарий:

#!/bin/bash
set -e
#WHAT SHOULD I WRITE HERE?
sleep 60 # this is for testing
#java ... | logger # this is what will be in the real script

Я хочу иметь возможность убить myscript и все его подпроцессы, отправив myscript SIGTERM:

$ kill -s SIGTERM 5929

Когда я запускаю его, я вижу ps fuxa:

me  3640  0.0  0.1 108416  2100 pts/2    Ss   09:38   0:00  \_ /bin/bash
me  5929  0.0  0.0 106060  1348 pts/2    S+   11:21   0:00      \_ /bin/bash myscript
me  5930  0.0  0.0 100908   604 pts/2    S+   11:21   0:00          \_ sleep 60

Я пробовал множество строк ловушек из разных ответов, которые я нашел:

#trap 'echo hello' SIGHUP SIGINT SIGTERM EXIT
#trap 'kill $(jobs -p)' SIGHUP SIGINT SIGTERM EXIT
#trap "trap - SIGTERM && kill -- -$$" SIGHUP SIGINT SIGTERM EXIT

Я использовал 1-й для отладки. Я испытываю то, что отправляю SIGTERM (или даже больше одного), и ничего не происходит. Когда я нажимаю Ctrl+C, myscript останавливается и пишет "привет" несколько раз. Таким образом, это подтверждает меня, что я отправляю сигнал TERM правильно и он получен, но все же я не достиг своей цели: немедленно остановить myscript. Я получил такие же результаты с двумя другими линиями ловушки.