Ark*_*nez 12 linux bash scripting children signals
我在一个bash脚本中包装一个fastcgi应用程序,如下所示:
#!/bin/bash
# stuff
./fastcgi_bin
# stuff
Run Code Online (Sandbox Code Playgroud)
由于bash仅在前台脚本结束时执行信号陷阱,因此我不能kill -TERM scriptpid因为fastcgi应用程序将保持活动状态.
我已经尝试将二进制文件发送到后台:
#!/bin/bash
# stuff
./fastcgi_bin &
PID=$!
trap "kill $PID" TERM
# stuff
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做,显然stdin和stdout没有正确重定向,因为它没有连接lighttpds mod_fastgi,前台版本确实有效.
编辑:我一直在看问题,这是因为bash在后台启动程序时将/ dev/null重定向到stdin,所以任何避免这种情况的方法也应该解决我的问题.
有关如何解决这个问题的任何提示?
kov*_*van 16
我想到了一些选择:
从shell脚本启动进程时,两者都属于同一进程组.杀死父进程会让孩子们活着,所以应该杀死整个进程组.这可以通过将否定的PGID(进程组ID)传递给kill来实现,这与父进程的PID相同.EJ:kill -TERM -$PARENT_PID
不要将二进制文件作为子进程执行,而是将脚本进程替换为exec.之后你失去了执行内容的能力,因为它exec完全取代了父进程.
不要杀死shell脚本进程,而是杀死FastCGI二进制文件.然后,在脚本中检查返回代码并相应地执行操作.例如:./fastcgi_bin || exit -1
根据mod_fastcgi处理工作进程的方式,只有第二个选项可行.