4

有没有办法从另一个进程启动脚本,这样如果进程死亡/结束,脚本仍然继续?

setuid 会这样做吗?如果我将所有者设置为root,然后启动脚本?

例如,如果我有一些 PHP 代码启动一个脚本,但 httpd 死掉或被杀死,我认为它会带走我的脚本。有没有解决的办法?

具体来说,我使用的是带有 Apache 2 和 PHP 5 的 Fedora 10。

4

5 回答 5

5

这里

function become_daemon() 
{
    $child = pcntl_fork();
    if($child) {
        exit; // kill parent
    }
    posix_setsid(); // become session leader
}

此外,关闭 STDIN、STDOUT 和 STDERR 是个好主意,但我不确定如何在 PHP 中执行此操作。

于 2009-05-13T00:51:47.760 回答
4

试试“nohup yourscript.sh &”

于 2009-05-13T01:22:45.617 回答
1

您应该使用 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 模块,它会为您处理这个问题(我是通过这里找到的)。

于 2009-05-13T01:15:08.740 回答
0

您可以使用 bash 中内置的“disown”将作业从生成它的 shell 中分离出来。见: http: //www.faqs.org/docs/bashman/bashref_79.html

于 2009-05-13T01:14:13.690 回答
-5

在命令 shell 中,您可以在命令行末尾附加一个与号 (&) 以在后台启动命令,从而将其与 shell 分离。

这里有一些很好的信息: http ://www.linuxforums.org/forum/linux-programming-scripting/50096-moving-processes-background-foreground.html

于 2009-05-13T00:53:50.843 回答