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

标签 linux bash scripting signals children

我正在像这样在 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/

相关文章:

bash - 如何区分 curl 最大时间和连接超时?

python - 在pycharm中使用linux控制台

python - 使用 Anaconda 安装软件包

c++ - Ament Tool ROS中如何链接共享库

linux - 不同发行版的脚本

json - 如何在不打开的情况下将巨大的单行json文件转换为多行文件?

.net - 如何在 XNA 引擎中嵌入 Ruby?

scripting - 更改MSI中 Action 序列记录的脚本

mysql - Bash MySQL 分割文件位置

linux - 根据反斜杠分隔符分割字符串