对于网站,我需要能够启动和停止守护进程。我目前正在做的是
exec("sudo /etc/init.d/daemonToStart start");
守护进程已启动,但Apache / PHP挂起。做ps aux
后发现sudo
本身已变为僵尸进程,有效杀死了所有进一步的进展。尝试从PHP启动daeomon时这是正常的行为吗?
是的,Apache有权执行/etc/init.d/daemonToStart
命令。我修改了/ etc / sudoers文件以允许它这样做。不,我不允许Apache能够执行任何类型的命令,只有少数几个允许网站工作。
无论如何,回到我的问题,有没有办法允许PHP以不创建僵尸进程的方式启动守护进程?我问这个是因为当我做相反的事情时,停止一个已经启动的守护进程,效果很好。
答案 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命令,这很麻烦。以下是我尝试过的一些事情:
/dev/null 2>&1 &
追加到命令的末尾。这会将错误重定向到标准输出。然后,您可以使用此输出进行调试。exec('echo $PATH; whoami;)
来完成此操作。这将告诉您PHP正在运行的用户,它是当前的PATH变量。