【问题标题】:Command executed through Proc::Async is not "tapped" correctly通过 Proc::Async 执行的命令未正确“点击”
【发布时间】:2021-12-09 07:59:48
【问题描述】:

我有这样的好...直接来自文档

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 上生成数据。 但 它只打印一行.. 输出:某事

它停止打印信息...脚本产生更多输出.. 可能是什么问题?

【问题讨论】:

    标签: linux raku


    【解决方案1】:

    您需要在程序结束时添加await $promise,否则它可能会在您调用的程序完成运行之前退出。

    更新(在 OP 编辑​​他的帖子之后)。

    OP 也说了关闭stackoverflow:

    程序结束时打印完整的输出.. 有相当大的延迟。

    如果是这种情况,问题很可能出在被调用的程序上,它缓冲了其 STDOUT(以及可能的 STDERR),因此观察程序甚至无法提前访问其输出。

    在被调用程序的适当句柄上调用 flush 可能会有所帮助。

    【讨论】:

    • 不,我添加了更多信息。
    • 如果我在命令行中运行相同的程序,则不会发生这种情况......行会提前打印出来。
    • 直接在终端运行程序通常会启用行缓冲,在管道中运行会切换到块缓冲。我想如果您通过| cat 运行其他程序,您会得到相同的结果。
    猜你喜欢
    • 2015-04-29
    • 2021-12-04
    • 2014-12-27
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 2017-05-23
    相关资源
    最近更新 更多