use strict;
use warnings;
use Parallel::ForkManager;
my $log = "/scripts/downloads/test.log";
print "Check the $log file\n" and open(LOG,">$log");
*STDERR = *LOG;
*STDOUT = *LOG;
my $pmm=new Parallel::ForkManager(9);
my @arr=(1..200);
for(@arr){
$pmm->start and next; # do the fork
print $_."\n";
$pmm->finish; # do the exit in the child process
}
$pmm->wait_all_children;
open(READ,"$log") or die $!;
my @check=<READ>;
print "there are ".scalar @arr ." items....";
print "but we only got ".scalar @check." items\n";
这是我要执行的脚本的简化版本。
在这种情况下,每当我使用9个以上的孩子时,我就会失去3-15个孩子,有时甚至更多。明显的答案是使用较少的子代,但是在我的“真实”脚本中,如果我使用较少的子代,则该脚本将花费更多的时间来完成……我们没有时间。为什么失去孩子,有没有办法“俘获”他们并让他们重新运行呢?
谢谢!
最佳答案
您要让所有孩子都写入相同的日志文件,并且尚未采取任何措施来防止他们覆盖彼此的输出。无法确定我机器上的问题,我不能肯定地说,但是我猜想所有N个孩子实际上都在运行,但是其中一些输出变得混乱了。
要使N个进程同时写入同一文件而不会丢失任何输出,您必须打开文件进行追加而不是常规写入。在C语言中,您可以将O_WRONLY|O_APPEND
与 open(2)
一起使用,或者将"a"
与 fopen(3)
一起使用。然后,内核确保所有写操作都到达文件的最后。 (但是,根据手册页,这在NFS上并不可靠。)您还必须注意一次写入文件的数量,否则一个进程的输出可能会出现在另一进程的输出中间。我不知道在Perl中这两种方法是否可行,但是听起来您还是找到了另一个解决方案。
关于perl - 失去 child 的 fork ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6886826/