$? = 13
означает, что ваш дочерний процесс был прерван сигналом SIGPIPE
. Ваша внешняя программа (bp_genbank2gff3.pl
) пыталась записать некоторый вывод в канал для вашей программы perl
. Но программа perl
закрыла свой конец канала, поэтому ваша ОС отправила SIGPIPE
внешней программе.
Выполняя sleep
ing в течение 3 секунд, вы позволяете своей программе работать в течение 3 секунд, прежде чем ОС убьет ее, так что это позволит вашей программе что-то сделать. Обратите внимание, что каналы имеют ограниченную емкость, поэтому, если ваш родительский perl
скрипт не читает из канала и если внешняя программа много пишет в стандартный вывод, операции записи внешней программы в конечном итоге блокируются, и вы не можете получить 3 секунд усилий от вашей внешней программы.
Обходной путь — прочитать вывод внешней программы, даже если вы просто собираетесь его выбросить.
open( my $command_out, "-|", $command );
my @ignore_me = <$command_out>;
close $command_out;
Обновление: если вас действительно не волнует вывод команды, вы можете избежать проблем SIGPIPE
, перенаправив вывод на /dev/null
:
open my $command_out, "-|", "$command > /dev/null";
close $command_out; # succeeds, no SIGPIPE
Конечно, если вы собираетесь приложить столько усилий, чтобы проигнорировать вывод, вы можете просто использовать system
.
Дополнительная информация: как говорит OP, закрытие переданного дескриптора файла заставляет родителя ждать завершения дочернего элемента (с помощью waitpid
или чего-то подобного). Но прежде чем он начнет ждать, он закрывает свой конец канала. В данном случае этот конец является концом канала для чтения, в который дочерний процесс записывает свой стандартный вывод. В следующий раз, когда дочерний процесс попытается записать что-то в стандартный вывод, ОС обнаружит, что конец этого канала для чтения закрыт, и отправит SIGPIPE
дочернему процессу, уничтожив его и быстро позволив оператору close
в родительском процессе завершиться.
person
mob
schedule
13.08.2010
close()
? Что такое$?
и, возможно,$!
?bp_genbank2gff3.pl
или расширение оболочки$ARGV[0]
разветвляются и выходят? Что, по словамstrace
илиtruss
, происходит? Вы уверены, что выходные файлы в рабочем случае не остались от несвязанной, успешной работы? Можете ли вы воспроизвести проблемное поведение с помощью какой-нибудь общедоступной утилиты оболочки, а неbp_...3.pl
? - person pilcrow   schedule 13.08.2010strace
возвращает очень длинный список, что мне искать? Я уверен, что вывод не является остатком, когдаsleep
включен (я удаляю все содержимое каталога перед запуском). Я не понял вашего вопроса о вилке. Кстати: github.com/bioperl/ bioperl-live/blob/master/scripts/Bio-DB-GFF/ - person David B   schedule 13.08.2010strace -fe trace=process my_perl_script
должно помочь вам начать. Однако @mobrule понял это из$?
. - person pilcrow   schedule 13.08.2010