IPC::Open3::open3() не работает с perl 5.14.2 как с perl 5.10.1?

В одном из наших модулей мы проверяем, является ли данный двоичный файл (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 $?'

Под Debian Squeeze, или Ubuntu Natty, с Perl 5.10.1, если varnishd не найден в системе, это печатает 65280 для меня. Если вы измените $binary в perl, то есть (правильно) печатает 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 различия файловой системы, например?).

1 ответ

Решение

Вы замечаете исправление ошибки.

В том, что вы называете 5.10.1 версии, open3 сообщил, что программа запустилась и завершилась с кодом 255. Ни один из них не соответствует действительности.

В том, что вы называете версией 5.14.2, open3 выдает исключение, как это всегда было задокументировано, и как это всегда делалось для некоторых других проблем. Вы можете поймать неудачи, чтобы запустить ребенка с помощью eval BLOCK если так хочется.

Другие вопросы по тегам