作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在像这样在 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/
我是一名优秀的程序员,十分优秀!