我在Ubuntu 13.04上使用此代码,
$cmd = "sleep 20 &> /dev/null &";
exec($cmd, $output);
虽然它实际上在那里停留了20秒并且等待:/通常它在使用&
将进程发送到后台时工作正常,但是在这台机器上php不会这样做:/
什么可能导致这个?
答案 0 :(得分:8)
尝试
<?PHP
$cmd = '/bin/sleep';
$args = array('20');
$pid=pcntl_fork();
if($pid==0)
{
posix_setsid();
pcntl_exec($cmd,$args,$_ENV);
// child becomes the standalone detached process
}
echo "DONE\n";
我测试了它的工作原理。 在这里,您首先分叉php进程,然后完成任务。
或者,如果pcntl模块不可用,请使用:
<?PHP
$cmd = "sleep 20 &> /dev/null &";
exec('/bin/bash -c "' . addslashes($cmd) . '"');
答案 1 :(得分:1)
原因不起作用是exec()
执行你传入它的字符串。由于shell将&
解释为“在后台执行”,但您未在exec
调用中执行shell,&
只会与{{1}一起传递到20
可执行文件 - 可能只是忽略了它。
这同样适用于输出的重定向,因为它也是由shell解析的,而不是在exec中解析。
因此,您需要找到一种方法来分叉您的进程(如上所述),或者将子进程作为shell运行的方法。
答案 2 :(得分:0)
我的解决方法是使用Apache2和任何版本的PHP在ubuntu 13.04上执行此操作:
libssh2-php
,我刚刚在使用PHP的本地SSH会话中使用了nohup $cmd &
并且它运行得很好,当然这需要放置某些安全协议,例如为Web服务器用户启用SSH访问,因此它将具有类似exec的权限,然后只允许localhost登录到webserver ssh帐户。