从PHP启动守护进程

时间:2011-12-05 14:47:22

标签: php daemon zombie-process

对于网站,我需要能够启动和停止守护进程。我目前正在做的是

exec("sudo /etc/init.d/daemonToStart start");

守护进程已启动,但Apache / PHP挂起。做ps aux后发现sudo本身已变为僵尸进程,有效杀死了所有进一步的进展。尝试从PHP启动daeomon时这是正常的行为吗?

是的,Apache有权执行/etc/init.d/daemonToStart命令。我修改了/ etc / sudoers文件以允许它这样做。不,我不允许Apache能够执行任何类型的命令,只有少数几个允许网站工作。

无论如何,回到我的问题,有没有办法允许PHP以不创建僵尸进程的方式启动守护进程?我问这个是因为当我做相反的事情时,停止一个已经启动的守护进程,效果很好。

3 个答案:

答案 0 :(得分:11)

尝试将> /dev/null 2>&1 &附加到命令。

所以这个:

exec("sudo /etc/init.d/daemonToStart > /dev/null 2>&1 &");

以防你想知道它的作用/原因:

  • > /dev/null - 将STDOUT重定向到/ dev / null(换言之,黑洞)
  • 2>&1 - 将STDERR重定向到STDOUT(黑洞也是如此)
  • &分离进程并在后台运行

答案 1 :(得分:2)

我遇到了同样的问题。

我同意DaveRandom,你必须压制每一个输出(stdout和stderr)。但是不需要在结尾“&”的另一个进程中启动:exec()函数不能再检查返回代码,即使出现错误也返回ok ...

我更喜欢将输出存储在临时文件中,而不是'blackhole'it。 工作解决方案:

$temp = tempnam(sys_get_temp_dir(), 'php');
exec('sudo /etc/init.d/daemonToStart >'.$temp.' 2>&1');

只需读取文件内容,然后删除临时文件:

$output = explode("\n", file_get_contents($temp));
@unlink($temp);

答案 2 :(得分:0)

我从来没有尝试过从PHP启动一个守护进程,但我已经尝试运行其他shell命令,这很麻烦。以下是我尝试过的一些事情:

  • 根据DaveRandom的回答,将/dev/null 2>&1 &追加到命令的末尾。这会将错误重定向到标准输出。然后,您可以使用此输出进行调试。
  • 确保您的网络服务器用户的PATH包含守护程序脚本中所有引用的二进制文件。您可以致电exec('echo $PATH; whoami;)来完成此操作。这将告诉您PHP正在运行的用户,它是当前的PATH变量。