【问题标题】:PHP exec in background using & is not workingPHP exec在后台使用&不起作用
【发布时间】:2013-01-02 22:42:57
【问题描述】:

我在 Ubuntu 13.04 上使用此代码,

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

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

【问题讨论】:

    标签: php linux background command


    【解决方案1】:

    试试

    <?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=&gt; nohup sleep 20 &amp;&gt; /dev/null &amp; This page was run in 20.082479000092 seconds array(0) { } 没用 :(
    • 将我的答案更改为经过测试的版本。
    • 唯一的问题是它需要启用 pcntl 编译的 PHP 版本,我没有:(
    • 再次更改了我的答案。抱歉,您的解决方案是个坏主意,因为它确实存在巨大的安全滞后。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这不是真的。 exec() 确实启动了一个 shell。检测 shell 存在的一种方法是执行 shell 认为无效的命令。例如,echo "&lt;?php exec('NonExistentCommand'); ?&gt;" | php 将打印类似“sh: NonExistentCommand: command not found”的内容。 sh: 部分来自 sh (/bin/sh)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多