处理和传播SIGHUP信号给子进程,而无需父进程终止

时间:2019-07-19 22:03:25

标签: linux bash signals

我遇到了一个经典问题,但是不知道如何解决。有一个执行子进程的bash进程,我想向它发送一些信号(SIGHUP),在那里处理它,并将此信号传播到其中一个子进程(例如,another_long_running_process)。这是代码段:

#!/bin/bash

long_running_process &
another_long_running_process &
pid=$!

trap 'kill -1 $pid' HUP

wait $pid

好吧,现在我设置陷阱,创建处理程序以将信号发送到特定的pid,但是随后发现我的脚本只是在第一次接收并处理SIGHUP之后退出。 bash从等待内置立即返回的问题:

  

当Bash在等待命令完成时收到已设置陷阱的信号时,直到命令完成才执行陷阱。当Bash通过等待内置函数等待异步命令时,接收到已设置陷阱的信号将导致等待内置函数立即返回且退出状态大于128,此后陷阱立即返回被执行。

是的,根据我的设计,在我第一次发送SIGHUP之后,我的脚本就会退出。但是我需要保持它运行。

我无法弄清楚如何等待子进程,并在它们运行时多次传播其中一个(好的,甚至所有它们)SIGHUP信号。在这样的问题定义中可以实现吗?我认为使用父对象pid可以遍历孩子并找到所需的过程,然后在那里特别发送信号,但这看起来有点工程过度,或者不是吗?

1 个答案:

答案 0 :(得分:0)

好吧,最后我用以下方法解决了我的问题:我在bash脚本中设置了忽略信号处理程序,并使其成为进程组的负责人。然后在another_long_running_process中重新定义SIGHUP处理程序,然后将信号发送到进程组。因此,bash脚本和long_running_process会忽略该信号,another_long_running_process会捕获信号并进行处理。