Проблема с буферизацией на открытом канале, запись в файл - PullRequest
1 голос
/ 29 мая 2020

У меня есть сценарий, который открывает процесс, запускающий внешнюю программу. Внешняя программа записывает в стандартный вывод, а в родительской программе я пишу как в стандартный вывод, так и в файл. Печать в стандартный вывод выполняется немедленно, но печать в файл буферизуется. Он должен ждать какого-то номера Xk, прежде чем выгружать его в файл. Я пробовал autoflu sh для выходного файла, канала, stdout, а также использовал stdbuf. Но ничего не работает, поскольку он записывает в файл только сообщения фрагментов. Я что-то упустил?

      my $output = "/home/output.log";
      open(OL,">$output");
      OL->autoflush(1);
      open(P,'-|',"stdbuf -o0 -e0 external_program.py 2>&1");
      $| = 1;
      P->autoflush(1);
      STDOUT->autoflush(1);
      while(<P>) {
        chomp;
        print OL "$_\n";
        print "$_\n";
      }
      close(OL);
      close(P);

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Hakon, у меня уже была запущена 'python3 .6 -u external_program.py'. Я наконец нашел то, что работает. Если я изменяю печать файла на flu sh каждый раз, когда он пишет строку, он работает

, поэтому я заменяю следующее:

    OL "$_\n";<br>
    with
    OL->printflush("$_\n");
0 голосов
/ 29 мая 2020

Я не уверен, почему stdbuf не работает, но вместо этого вы можете использовать команду unbuffer. Вот простой пример:

use feature qw(say);
use strict;
use warnings;
my $output = "output.log";
open(my $OL,">", $output) or die "Could not open file '$output': $!";
my $pid = open (my $P, '-|', "unbuffer test.pl 2>&1");
while(<$P>) {
    chomp;
    print $OL "$_\n";
    print "$_\n";
}
close $OL;
close $P;

где test.pl задается как:

#! /usr/bin/env perl
use strict;
use warnings;
for (1..5) {
    print "Hello\n";
    sleep 1;
}

Вы можете установить команду unbuffer в Ubuntu с помощью sudo apt-get install expect

Без команды unbuffer в приведенном выше сценарии все пять строк с Hello печатаются сразу через 5 секунд в окне терминала. Когда используется команда unbuffer, каждую секунду появляется новая строка с Hello.

Обновление :

Поскольку ваш сценарий называется external_program.py, я предполагаю это программа python? Затем есть опция командной строки -u для python, которая отключает буферизацию, и вы можете использовать эту опцию вместо запуска unbuffer.

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