我将 fastcgi 应用程序包装在 bash 脚本中,如下所示:
#!/bin/bash
# stuff
./fastcgi_bin
# stuff
由于 bash 仅在前台脚本结束时执行信号陷阱,所以我不能只是kill -TERM scriptpid
因为 fastcgi 应用程序将保持活动状态。
我尝试将二进制文件发送到后台:
#!/bin/bash
# stuff
./fastcgi_bin &
PID=$!
trap "kill $PID" TERM
# stuff
但是如果我这样做,显然标准输入和标准输出没有正确重定向,因为它没有与lighttpds mod_fastgi连接,前台版本确实可以工作。
EDIT:我一直在研究这个问题,发生这种情况是因为当程序在后台启动时 bash 将 /dev/null 重定向到 stdin,所以任何避免这种情况的方法也应该解决我的问题。
关于如何解决这个问题有任何提示吗?
我想到了一些选择:
当从 shell 脚本启动进程时,两者都属于同一进程组。杀死父进程会使子进程存活,因此应该杀死整个进程组。这可以通过将否定的PGID(进程组ID)传递给kill来实现,它与父进程的PID相同。英语:kill -TERM -$PARENT_PID
不要执行二进制文件
一个孩子,但替换了脚本
处理与exec
。你失去了
之后执行事情的能力
不过,因为exec
完全地
替换父进程。
不要杀死 shell 脚本进程,而是杀死 FastCGI 二进制文件。然后,在脚本中检查返回代码并采取相应措施。例如:./fastcgi_bin || exit -1
根据 mod_fastcgi 处理工作进程的方式,只有第二个选项可能是可行的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)