当信号到来时,杀死bash脚本前景子节点

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处理工作进程的方式,只有第二个选项可行.

  • `exec`正是我所需要的!谢谢 (2认同)