Команда, выполняемая через Proc::Async, неправильно «прослушивается»

#linux #raku

#linux #raku

Вопрос:

У меня есть такой хороший вариант … прямо из документации

 my $proc = Proc::Async.new: ‘raku’, ‘script.raku’;
$proc.stdout.tap(-> $v { print "Output: $v" }, quit => { say 'caught exception ' ~ .^name });
$proc.stderr.tap(-> $v { print "Error:  $v" });
my $promise = $proc.start;
Thread.start: {  await $promise;}
sleep 30;
 

Скрипт выдает данные в stdout и stderr.
Но
она печатает только одну строку..
Вывод: что-то

Он прекращает вывод информации… Скрипт выдает гораздо больше выходных данных.. В чем может быть проблема?

Ответ №1:

Вам нужно await $promise в конце вашей программы, иначе она может просто завершиться до завершения работы вызываемой вами программы.

Обновление (после того, как ОП отредактировал свой пост).

OP также сказал off stackoverflow:

Полный вывод печатается при завершении программы.. со значительной задержкой.

Если это так, проблема, скорее всего, связана с вызываемой программой, которая буферизует свой стандартный вывод (и, возможно, STDERR), и поэтому наблюдающая программа даже не имеет раннего доступа к своему выводу.

Может помочь вызов flush для соответствующего дескриптора в вызываемой программе.

Комментарии:

1. нет, я добавил больше информации.

2. Если я запускаю ту же программу в командной строке, этого не происходит… Строки распечатываются ранее.

3. прямой запуск программы в терминале обычно включает буферизацию строк, запуск ее в канале переключает ее на блокировку буферизации. Я думаю, вы получите тот же результат, если запустите свою другую программу | cat .