gpt4 book ai didi

linux - 在没有父进程终止的情况下处理 SIGHUP 信号并将其传播到子进程

转载 作者:太空宇宙 更新时间:2023-11-04 11:47:43 25 4
gpt4 key购买 nike

我有一个经典问题,但不知道如何处理它。有一个执行子进程的 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内置wait立即返回的问题:

When Bash receives a signal for which a trap has been set while waiting for a command to complete, the trap will not be executed until the command completes. When Bash is waiting for an asynchronous command via the wait built-in, the reception of a signal for which a trap has been set will cause the wait built-in to return immediately with an exit status greater than 128, immediately after which the trap is executed.

是的,我的脚本只是在我第一次发送 SIGHUP 后退出,这是故意的。但我需要让它继续运行。

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

最佳答案

好的,最后我用以下方法解决了我的问题:我在 bash 脚本中设置了忽略信号处理程序并使其成为进程组的领导者。然后在 another_long_running_process 中重新定义 SIGHUP 处理程序,然后将信号发送到进程组。所以 bash-script 和 long_running_process 忽略该信号,而 another_long_running_process 捕获信号并处理它。

关于linux - 在没有父进程终止的情况下处理 SIGHUP 信号并将其传播到子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57120038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com