【发布时间】:2013-01-02 22:42:57
【问题描述】:
我在 Ubuntu 13.04 上使用此代码,
$cmd = "sleep 20 &> /dev/null &";
exec($cmd, $output);
虽然它实际上会在那里等待 20 秒并等待:/ 通常在使用 & 将进程发送到后台时它可以正常工作,但在这台机器上 php 不会这样做:/
这可能是什么原因造成的??
【问题讨论】:
标签: php linux background command
我在 Ubuntu 13.04 上使用此代码,
$cmd = "sleep 20 &> /dev/null &";
exec($cmd, $output);
虽然它实际上会在那里等待 20 秒并等待:/ 通常在使用 & 将进程发送到后台时它可以正常工作,但在这台机器上 php 不会这样做:/
这可能是什么原因造成的??
【问题讨论】:
标签: php linux background command
试试
<?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) . '"');
【讨论】:
CMD=> nohup sleep 20 &> /dev/null & This page was run in 20.082479000092 seconds array(0) { } 没用 :(
这不起作用的原因是exec() 执行您传递给它的字符串。由于& 被shell 解释为“在后台执行”,但您没有在exec 调用中执行shell,所以& 只是与20 一起传递给/bin/sleep 可执行文件- 这可能只是忽略了这一点。
同样适用于输出的重定向,因为它也是由 shell 解析的,而不是在 exec 中。
因此,您需要找到一种方法来分叉您的进程(如上所述),或者找到一种将子进程作为 shell 运行的方法。
【讨论】:
exec() 确实启动了一个 shell。检测 shell 存在的一种方法是执行 shell 认为无效的命令。例如,echo "<?php exec('NonExistentCommand'); ?>" | php 将打印类似“sh: NonExistentCommand: command not found”的内容。 sh: 部分来自 sh (/bin/sh)
我在 ubuntu 13.04 上使用 Apache2 和任何版本的 PHP 执行此操作的解决方法:libssh2-php,我只是在使用 PHP 的本地 SSH 会话中使用了nohup $cmd &,它在后台运行得很好,当然这需要设置某些安全协议,例如为 webserver 用户启用 SSH 访问,因此它具有类似 exec 的权限,然后只允许 localhost 登录到 webserver ssh 帐户。
【讨论】: