Как перенаправить вывод этого сценария Perl в файл? - PullRequest
0 голосов
/ 04 июня 2018

У меня нет большого опыта работы с Perl, и я был бы признателен за любые / все отзывы ....

[Перед тем как начать: у меня нет доступа / полномочий для изменения существующих сценариев Perl.]

Я запускаю несколько сценариев perl несколько раз в день, но я хотел бы начать записывать их вывод в файл.

Первый сценарий perl не принимает никаких аргументов, и я могу без проблем «подать» его вывод:

/asdf/loc1/rebuild-stuff.pl 2>&1 | tee $mytmpfile1

Второй сценарий perl зависает с помощью этой команды:

/asdf/loc1/create-site.pl --record=${newsite} 2>&1 | tee $mytmpfile2

К вашему сведению, следующая команда НЕ зависает:

/asdf/loc1/create-site.pl --record=${newsite} 2>&1

Мне интересно, пытается ли /asdf/loc1/create-site.pl обработать | tee $mytmpfile2 как дополнительную?аргументы командной строки?Мне не разрешено делиться всем сценарием, но вот начало его основной процедуры:

...
my $fullpath = $0;
$0 =~ s%.*/%%;

# Parse command-line options.
...
Getopt::Long::config ('no_ignore_case','bundling');
GetOptions ('h|help'               => \$help,
            'n|dry-run|just-print' => \$preview,
            'q|quiet|no-mail'      => \$quiet,
            'r|record=s'           => \$record,
            'V|noverify'           => \$skipverify,
            'v|version'            => \$version) or exit 1;
...

Предоставляет ли приведенный выше код какие-либо подсказки?У вас есть какие-либо советы, кроме как изменить сценарий, чтобы я мог записать его вывод в файл?

1 Ответ

0 голосов
/ 05 июня 2018

Это не висит.Вы «страдаете от буферизации».Как и большинство программ, STDOUT в Perl по умолчанию буферизуется.Как и большинство программ, в Perl STDOUT сбрасывается символом новой строки при подключении к терминалу и блокируется буферизованным образом.Когда STDOUT не подключен к терминалу, вы не получите никакого вывода, пока не будет накоплен выходной сигнал 4 КиБ или 8 КиБ (в зависимости от вашей версии Perl) или программа не завершится.

Вы можете добавить $| = 1; к скрипту, чтобы отключить буферизацию для STDOUT.Если ваша программа завершается с истинным значением или завершает работу, используя exit, вы можете сделать это без изменения файла .pl.Просто используйте следующую оболочку:

perl -e'
   $| = 1;
   $0 = shift;
   do($0);
   my $e = $@ || $! || "$0 didn\x27t return a true value\n";
   die($e) if $e;
' -- prog args | ...

Или вы можете обмануть программу, думая, что она подключена к терминалу, используя unbuffer.

unbuffer prog args | ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...