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

Linux 逐行读取文件fork/exec-Perl,linux,perl,bash,while-loop,line-by-line,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 execu

目前,我正在尝试使用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
不幸的是,它并没有像预期的那样工作,它似乎读取随机行,而不是顺序中的行。我相信这是由于分叉的过程,但不知道如何解决它

这个问题可能是相关的 但我还是很困惑

test.txt

test.pl


你对这个问题的描述(“它似乎是随机读出来的”)非常模糊

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

不过,我相信我仍然可以回答你的问题:

不能保证孩子们会按照开始的顺序结束。

您将以任意顺序(甚至混合)获得前5个子项的输出,然后您将以任意顺序(甚至混合)获得下5个子项的输出,以此类推


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

是否需要等待所有5项完成,或者一次最多运行5个子级就足够了吗?你得到了什么输出,你期望得到什么输出?你的代码甚至没有编译。是的,它编译了。需要删除严格的警告。我为无法工作的代码道歉。这是我从原始代码创建的一个糟糕的示例。我只是希望你能看到我试图归档的内容。谢谢你的回复,我对这个问题的模糊描述表示歉意。你所说的很有道理,但是如何监控孩子们检查他们是否完成并继续运行下一个5分钟呢?好的,现在就知道了!!每个子进程并不是一个接一个地完成,而是一个接一个地完成。
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
$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); 
sleep 5
echo "I was passed the following arg:"
echo $1
echo $2