gpt4 book ai didi

linux - 信号到来时杀死 bash 脚本前景子项

转载 作者:IT王子 更新时间:2023-10-28 23:53:36 26 4
gpt4 key购买 nike

我正在像这样在 bash 脚本中包装一个 fastcgi 应用程序:

#!/bin/bash
# stuff
./fastcgi_bin
# stuff

由于 bash 仅在前台脚本结束时执行信号陷阱,我不能只kill -TERM scriptpid 因为 fastcgi 应用程序将保持事件状态。
我试过将二进制文件发送到后台:

#!/bin/bash
# stuff
./fastcgi_bin &
PID=$!
trap "kill $PID" TERM
# stuff

但如果我这样做,显然 stdin 和 stdout 没有正确重定向,因为它没有与 lighttpds mod_fastgi 连接,前台版本确实有效。

编辑: 我一直在研究这个问题,发生这种情况是因为当程序在后台启动时 bash 将/dev/null 重定向到 stdin,所以任何避免这种情况的方法都应该解决我的问题问题也是如此。

关于如何解决这个问题的任何提示?

最佳答案

我想到了一些选项:

  • 当一个进程从 shell 脚本启动时,它们都属于同一个进程组。杀死父进程会使子进程存活,因此应该杀死整个进程组。这可以通过将否定的PGID(进程组ID)传递给kill来实现,它与父进程的PID相同。 ej: kill -TERM -$PARENT_PID

  • 不要执行二进制文件一个 child ,但替换脚本使用 exec 处理。你失去了事后执行事情的能力不过,因为 exec 完全替换父进程。

  • 不要杀死 shell 脚本进程,而是杀死 FastCGI 二进制文件。然后,在脚本中,检查返回码并采取相应的行动。例如:./fastcgi_bin ||退出-1

根据 mod_fastcgi 处理工作进程的方式,只有第二个选项可能可行。

关于linux - 信号到来时杀死 bash 脚本前景子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4261726/

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