gpt4 book ai didi

linux - 我怎样才能在后台运行东西并在 Perl 中重定向它们的输出?

转载 作者:太空狗 更新时间:2023-10-29 11:15:38 26 4
gpt4 key购买 nike

my $pm = new Parallel::ForkManager(4);

foreach my $array (@lines) {
$pm->start and next;
$cmd = 'command';
print "\n$cmd\n\n";
exec($cmd);
$pm->finish; }
$pm->wait_all_children;

如您所见,我的代码一次运行 4 个东西。这是 ffmpeg 管道视频到 x264。它的输出很乱,在 4 个输出之间的一条线上跳来跳去。有没有办法完全在后台运行这些并重定向其输出,以便我可以干净地打印和更新 4 个单独的输出?如果我能说出每个过程的进展情况,那就太好了。

如果它绝对不能用 perl 完成,我很乐意接受任何帮助,指导我使用另一种语言,这将使这更容易。顺便说一下,这是在 Linux 下。谢谢。

Open2 超出了我的理解范围。我将如何使用它?我无法理解如何在不换行的情况下打印每件事的进度。我想打印每个进程正在执行的任何操作的 STDERR 和 STDOUT,当它结束时,将其保留为不更新的行。这不是一个很好的解释,但我不知道还能如何解释我想要的东西。基本上,前 4 个作业将有 4 行不断刷新。然后,当其中一项工作完成后,为新工作添加一个新行,并可能以某种方式表明已完成的工作已完成。

我用“打开”尝试了一个快速测试,它仍然输出到 shell。这是在 Windows 中,但它的行为应该仍然相同。这甚至可以用 Perl 或什至在 shell 中实现吗?

喂?我仍然需要帮助...

最佳答案

如果要捕获每个进程的STDOUT,可以使用open而不是 exec 来运行你的子进程。

foreach my $array(@lines) { 
$pm->start and next;
my $cmd = 'command';
open my $cmd_out, '-|', $cmd or die "Can't start process: $!";

# read from command output
while( my $line = <$cmd_out> ) {
# do something with output
}

$pm->finish;
}

如果您需要同时捕获 STDOUT 和 STDERR,请参阅 IPC::Open2 .还有 IPC::Open3如果您还需要 STDIN 的句柄。

关于linux - 我怎样才能在后台运行东西并在 Perl 中重定向它们的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11571772/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com