加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用Bash运行前台子进程可靠地使用陷阱

发布时间:2020-12-16 01:33:19 所属栏目:安全 来源:网络整理
导读:我有一个 Bash脚本,它在前台运行一个长时间运行的进程.当它收到SIGQUIT信号时,它应该执行各种清理操作,例如查杀自身及其所有子进程(通过杀死进程组等).应该捕获信号的最小脚本如下所示(称为test_trap.sh): #!/bin/bashtrap 'echo "TRAP CAUGHT"; exit 1' QU
我有一个 Bash脚本,它在前台运行一个长时间运行的进程.当它收到SIGQUIT信号时,它应该执行各种清理操作,例如查杀自身及其所有子进程(通过杀死进程组等).应该捕获信号的最小脚本如下所示(称为test_trap.sh):
#!/bin/bash

trap 'echo "TRAP CAUGHT"; exit 1' QUIT  # other required signals are omitted for brevity

echo starting sleep
sleep 11666
echo ending sleep

echo done

我想将SIGHUP信号发送到test_trap.sh脚本的进程.但是,向test_trap.sh发送SIGHUP不会触发陷阱表达式,但只有当我将信号发送到子睡眠11666进程时才会触发陷阱.下面是一个bash会话,展示了这一点:

bash-4.1$test_trap.sh &
[1] 19633
bash-4.1$starting sleep

bash-4.1$kill -s SIGQUIT 19633
bash-4.1$jobs
[1]+  Running                 test_trap.sh &
bash-4.1$ps -ef --forest --cols=10000 | grep '11666|test_trap.sh' | grep -v grep
theuser   19633 12227  0 07:40 pts/4    00:00:00              _ /bin/bash ./test_trap.sh
theuser   19634 19633  0 07:40 pts/4    00:00:00              |   _ sleep 11666
bash-4.1$kill -s SIGQUIT 19634
bash-4.1$Quit (core dumped)
TRAP CAUGHT

[1]+  Exit 1                  test_trap.sh
bash-4.1$ps -ef --forest --cols=10000 | grep '11666|test_trap.sh' | grep -v grep
bash-4.1$

请注意,“睡眠11666”只是一个代表性的过程.该过程实际上可以是交互式子shell(例如,bash -i).

为什么父test_trap.sh进程没有捕获SIGHUP信号?为什么只有在发出睡眠过程11666时才会触发陷阱?

我不想使用无法捕获的SIGKILL,因为我需要在陷阱表达式中进行各种清理操作.

此脚本适用于任何包含Bash的Linux发行版的最新版本(例如,不是Cygwin).

参考文献:

> killing Parent process along with child process using SIGKILL
> Kill bash and child process

bash必须等待sleep才能执行处理程序.一个好的解决方法是在后台运行睡眠,然后立即等待它.虽然睡眠是不间断的,但等不是.
trap 'kill $sleep_pid; echo "TRAP CAUGHT"; exit 1' QUIT

echo starting sleep
sleep 11666 &
sleep_pid=$!
wait
echo ending sleep

echo done

sleep_pid的记录和使用它来从处理程序中杀死睡眠是可选的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读