PHP exec在后台使用&不管用

时间:2013-01-19 07:35:04

标签: php linux background command

我在Ubuntu 13.04上使用此代码,

$cmd = "sleep 20 &> /dev/null &";
exec($cmd, $output);

虽然它实际上在那里停留了20秒并且等待:/通常它在使用&将进程发送到后台时工作正常,但是在这台机器上php不会这样做:/
什么可能导致这个?

3 个答案:

答案 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帐户。

相关问题