3

我在 Ubuntu 13.04 上使用此代码,

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

虽然它实际上在那里等待了 20 秒并等待:/ 通常它在&用于将进程发送到后台时工作正常,但是在这台机器上 php 就不会这样做:/
可能是什么原因造成的?

4

3 回答 3

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";

我对其进行了测试,因为它有效。在这里,您首先 fork php 进程,然后执行您的任务。

或者,如果 pcntl 模块不可用,请使用:

<?PHP

$cmd = "sleep 20 &> /dev/null &";
exec('/bin/bash -c "' . addslashes($cmd) . '"');
于 2013-01-19T07:44:37.823 回答
1

不起作用的原因是exec()执行您传递给它的字符串。由于&被 shell 解释为“在后台执行”,但您没有在exec调用中执行 shell,因此&只是将其传递20/bin/sleep可执行文件——它可能只是忽略了这一点。

这同样适用于输出的重定向,因为它也由 shell 解析,而不是在 exec 中。

因此,您需要找到一种方法来分叉您的进程(如上所述),或者找到一种将子进程作为 shell 运行的方法。

于 2013-01-19T12:55:41.560 回答
0

我在 ubuntu 13.04 上使用 Apache2 和任何版本的 PHP 执行此操作的解决方法:
libssh2-php,我只是nohup $cmd &在使用 PHP 的本地 SSH 会话中使用它并且它在后台运行得很好,当然这需要放置某些安全协议,例如启用webserver 用户的 SSH 访问权限,因此它将具有类似 exec 的权限,然后只允许 localhost 登录到 webserver ssh 帐户。

于 2013-01-21T12:47:06.003 回答