linux - 逐行读取文件 fork/exec - Perl

标签 linux perl bash while-loop line-by-line

目前我正在尝试使用 perl 逐行读取文件并 fork 进程

基本上,我的 Perl 脚本“test.pl”使用 exec 执行另一个脚本,其工作方式应该是使用文件行作为 exec 函数中的命令行参数,对文件的每 5 行执行脚本“run.sh”,然后等待这 5 个进程完成并继续。

Line: 1 - run.sh executed
Line: 2 - run.sh executed
Line: 3 - run.sh executed
Line: 4 - run.sh executed
Line: 5 - run.sh executed - WAIT HERE for "run.sh" to complete then continue 
Line: 6 - run.sh executed
Line: 7 - run.sh executed
Line: 8 - run.sh executed
Line: 9 - run.sh executed
Line: 10 - run.sh executed

不幸的是,它没有按预期工作,而且它似乎读取随机行,而不是按顺序读取行,我相信这是由于 fork 了进程,但不确定如何解决它。

这个问题可能是相关的 Fork in Perl not working inside a while loop reading from file但我还是很困惑。

test.txt

5-6
7-1
5-9
1-22
8-55
9-6
3-5
7-1
5-9
1-22
8-55
9-6
3-5

test.pl

$count = 0;
open (MYFILE, 'test.txt');
while (<MYFILE>) { 
    $data = $_;
    $data =~ s/\R//g;
    chomp();
    my $pid = fork();
    if ($pid == -1) {
        die;
    } elsif ($pid == 0) {
        exec './run.sh', "-r $data" or die;
        print $count;
    }

    if( ($count%5) == 0 ){
        while (wait() != -1) {}
    }

    $count ++;
}
close (MYFILE); 

run.sh

sleep 5
echo "I was passed the following arg:"
echo $1
echo $2

最佳答案

您对问题的描述(“它似乎读取随机行”)非常模糊。

您的代码有很多问题,其中许多甚至无法编译。

但是,我相信我仍然可以回答你的问题:

无法保证子级会按照开始的顺序结束。

您将以任何顺序(甚至混合)获得前 5 个子级的输出,然后您将以任何顺序(甚至混合)获得接下来 5 个子级的输出,依此类推。

如果您想按特定顺序输出结果,则需要收集子级的输出,并根据生成输出的子级的启动顺序对输出重新排序后重新打印。

关于linux - 逐行读取文件 fork/exec - Perl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16868936/

相关文章:

bash - 将 Json 文件中存在的多个卷安装为列表

java - PdfBox 2.0.3 NullPointerException 在 Linux 上的字体编码

Linux Mac 上的 Java URLConnection

perl - 如何通过 OTRS 中的 Web 服务(SOAP 或 REST)将配置项链接/获取到工单

perl - 在无效上下文中无用地使用登录

linux - Bash - 在目录及其 sbdirectories 中查找多个特定文件夹并重命名这些特定文件夹

linux - 如何检查 find 命令是否没有找到任何东西?

java - 通过java调用外部程序

linux - ntpd sync 后执行脚本

perl - 给定一个输入词,如何生成发音相似的词列表?