有没有办法从另一个进程启动脚本,这样如果进程死亡/结束,脚本仍然继续?
setuid 会这样做吗?如果我将所有者设置为root,然后启动脚本?
例如,如果我有一些 PHP 代码启动一个脚本,但 httpd 死掉或被杀死,我认为它会带走我的脚本。有没有解决的办法?
具体来说,我使用的是带有 Apache 2 和 PHP 5 的 Fedora 10。
从这里:
function become_daemon()
{
$child = pcntl_fork();
if($child) {
exit; // kill parent
}
posix_setsid(); // become session leader
}
此外,关闭 STDIN、STDOUT 和 STDERR 是个好主意,但我不确定如何在 PHP 中执行此操作。
试试“nohup yourscript.sh &”
您应该使用 php 的 pcntl_fork() (由@bmdhacks 推荐)。
基本过程是,fork,setsid,再fork,chdir 到/,然后关闭所有打开的文件描述符。标准做法还要求您创建一个名为/var/run/$NAME
, 的文件(其中 $NAME 是您的守护程序的名称),并将 PID 写入该文件,以便您以后可以控制进程执行。
我不是 php 程序员,但这是标准的 *nix 东西。我可以谷歌搜索的最好的 php 示例看起来像这个hello-world-daemon-with-fork 但是,他没有将他的工作目录更改为“/”,也没有看起来他关闭了打开的文件描述符(我不确定这将如何在 php 中工作),因此他没有连接到原始进程的标准输入、标准输出和标准错误。
我又挖了一点,发现另一篇文章可能对 php 的pcntl_fork()有帮助
而且,看起来有一个名为System_Daemon的 pear 模块,它会为您处理这个问题(我是通过这里找到的)。
您可以使用 bash 中内置的“disown”将作业从生成它的 shell 中分离出来。见: http: //www.faqs.org/docs/bashman/bashref_79.html
在命令 shell 中,您可以在命令行末尾附加一个与号 (&) 以在后台启动命令,从而将其与 shell 分离。