4

在我们的一个模块中,我们检查给定的二进制文件 ( varnishd) 是否存在,如果存在,我们运行额外的测试。

为了执行检查,我们使用IPC::Open3,像这样(为了清楚起见,示例被剥离):

perl -MIPC::Open3 -le '
    my $binary = "varnishd";
    my $pid = IPC::Open3::open3(my($in, $out), undef, $binary, "-V");
    waitpid $pid, 0; print $?'

在带有perl 5.10.1的 Debian Squeeze 或 Ubuntu Natty 下,如果varnishd在系统上找不到,则会65280为我打印。如果您将 更改$binaryperl,则(正确)打印0.

但是,对于 Ubuntu Precise 和perl 5.14.2,这不再以相同的方式工作,并产生以下结果:

$ perl -MIPC::Open3 -le '
    my $binary = "varnishd";
    my $pid = IPC::Open3::open3(my($in, $out), undef, $binary, "-V");
    waitpid $pid, 0; print $?'
open3: exec of varnishd -V failed at -e line1

例如,当我将 更改为$binary存在的东西时,perl它可以正常工作并打印0.

$ perl -MIPC::Open3 -le '
    my $binary = "perl";
    my $pid = IPC::Open3::open3(my($in, $out), undef, $binary, "-V");
    waitpid $pid, 0; print $?'
0

阅读其他问题和答案,看起来我想研究IPC::Run,但实际上我想:

  • 了解这种行为差异
  • 如果可能的话,避免更多的依赖

编辑:忘了提到这些东西是在chroot环境下运行的,包括 Squeeze 和 Precise 系统,如果这完全相关(/dev例如文件系统差异?)。

4

1 回答 1

10

您注意到一个错误 修复

在您所谓的 5.10.1 版本中,open3报告该程序运行并以代码 255 退出。这些都不是真的。

在您所谓的 5.14.2 版本中,open3它会抛出异常,因为它一直被记录在案,而且它总是针对其他一些问题所做的。如果需要,您可能会发现使用 with 启动子进程失败eval BLOCK

于 2012-08-22T12:41:46.573 回答