我有一个老问题,但不知道如何处理。有一个bash进程执行子进程,我想向它发送一些信号(SIGHUP),在那里处理它并将这个信号传播给其中一个子进程(例如another_long_running_process)。下面是snippet:
#!/bin/bash
long_running_process &
another_long_running_process &
pid=$!
trap 'kill -1 $pid' HUP
wait $pid
好了,现在我设置陷阱,创建处理程序发送信号到特定的pid,但然后发现我的脚本只是退出后,第一SIGHUP接收和处理。bash从wait内置立即返回的问题:
当Bash在等待命令完成时收到已设置陷阱的信号时,陷阱将不会执行,直到命令完成。当Bash通过wait内置等待异步命令时,接收到一个设置了陷阱的信号将导致wait内置立即返回,退出状态大于128,然后立即执行陷阱。
是的,我的脚本只是退出后,我第一次发送SIGHUP,由设计。但我得让它继续运转。
我不知道如何等待子进程,并在它们运行时多次传播其中一个(好吧,甚至所有)SIGHUP信号。在这样的问题定义中,这是可以实现的吗?我想用父pid我可以迭代子进程,找到需要的进程,然后发送信号,特别是在那里,但它看起来有点过度工程化,或者不是?
1条答案
按热度按时间3lxsmp7m1#
最后,我用以下方法解决了这个问题:我在bash-script中设置了忽略信号处理器,并使其成为进程组的领导者。然后在another_long_running_process中重新定义SIGHUP处理程序,然后向 * 进程组 * 发送信号。所以bash-script和long_running_process忽略该信号,而另一个_long_running_process捕获信号并处理它。