如何编写一个 bash 脚本来捕获 SIGTERM 并立即终止进程和所有子进程

如何编写一个 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 发送 SIGTERM 来终止 myscript 及其所有子进程:

$ 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

我使用第一个进行调试。我的经验是,我发送了 SIGTERM(甚至不止一个),但什么也没发生。当我按下 时Ctrl+C,myscript 停止,并多次写入“hello”。因此,这证实了我发送 TERM 信号的方式是正确的,并且它被接收到了,但我仍然没有实现我的目标:立即停止 myscript。我用另外 2 条陷阱线得到了相同的结果。

相关内容