除非首先关闭STDIN,否则Perl exec('/ usr/bin/php -v')挂起在CentOS 6.6上

Kri*_*sor 10 php perl stdin centos pipe

我的问题是,这是预期的(以及为什么?)和/或在其他系统上也可以看到这种行为?

环境:

# cat /etc/*-release
CentOS release 6.6 (Final)
...
# perl -v 

This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
...
# php -v
PHP 5.4.41 (cli) (built: May 14 2015 23:15:28) 
... 
Run Code Online (Sandbox Code Playgroud)

mini.pl:

#!/usr/bin/perl
exec('/usr/bin/php -v');
Run Code Online (Sandbox Code Playgroud)

运行它,看看挂起的PHP进程:

# perl mini.pl &
[2] 16958
[1]   Killed                  perl mini.pl
# ps ax | grep 16958
16958 pts/2    T      0:00 /usr/bin/php -v
16960 pts/2    S+     0:00 grep 16958

[2]+  Stopped                 perl mini.pl
Run Code Online (Sandbox Code Playgroud)

但如果我关闭STDIN:

mini.pl:

#!/usr/bin/perl
close(STDIN);
exec('/usr/bin/php -v');
Run Code Online (Sandbox Code Playgroud)

它运行良好:

# perl mini.pl &
[1] 16976
# PHP 5.4.41 (cli) (built: May 14 2015 23:15:28) 
...

[1]+  Done                    perl mini.pl
# ps ax | grep 16976
16978 pts/2    S+     0:00 grep 16976
Run Code Online (Sandbox Code Playgroud)

其他说明:

  • 我无法在Mac OS X上重现这种悬挂行为(perl 5.18.2,php 5.5.24)

谢谢,

And*_*isi 1

我刚刚在 Ubuntu 14.04 和 RHEL 6.7 上进行了测试,无法重现该问题。

我怀疑有一个错误导致它打印版本并尝试将 STDIN 作为 PHP 代码进行处理。当它挂起时,尝试按 Control-D,或键入几行 HTML/PHP,然后按 Control-D 以查看您的输入是否已处理。