【问题标题】:PHP proc_open bash vs dashPHP proc_open bash 与破折号
【发布时间】:2014-03-25 19:19:51
【问题描述】:

考虑这个示例脚本:

<?php

$pipes = array();
$p = proc_open('cat', array(0 => STDIN, 1 => STDOUT, 2 => STDERR), $pipes);
fgetc(STDIN);

/bin/sh 符号链接到/bin/dash(Debian 默认值)时,cat 在 shell 中执行:

30760 pts/0    S+     0:00  |           \_ php f.php
30761 pts/0    S+     0:00  |               \_ sh -c cat
30762 pts/0    S+     0:00  |                   \_ cat

然而,当/bin/sh 链接到/bin/bash 时,catphp 的直接子代:

30786 pts/0    S+     0:00  |           \_ php f.php
30787 pts/0    S+     0:00  |               \_ cat

这是非常烦人的不一致,使得无法可靠地向衍生进程发送信号(因为信号有时会被 shell 接收)。

为什么proc_open 的行为会因/bin/sh 指向的位置而不同? 有没有办法不运行 shell,即使 /bin/sh 不是 bash

【问题讨论】:

    标签: php linux proc-open


    【解决方案1】:

    PHP 在这两种情况下都通过 /bin/sh 运行命令,区别在于 shell,而不是 PHP。 dash 分叉进程以运行命令(在本例中为 cat)并等待它完成。 bash 执行了一个 execve(),因此它用 cat 替换了自己的进程。

    他们似乎在以后的版本中修复了它:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=436466

    使用 bash 或最新版本的 dash 应该可以解决您的问题,因为执行的命令会获取生成的 shell 的 PID,从而接收信号。

    【讨论】:

    • 谢谢。我想这是 readme.md 的“警告”部分的内容。
    • 我仍然在 Dash 0.5.8.2 中看到这个问题,但我通过在传递给 proc_open() 的命令行前添加 exec 来解决这个问题。
    猜你喜欢
    • 2017-01-18
    • 1970-01-01
    • 2011-11-05
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2016-09-18
    相关资源
    最近更新 更多