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