因此,当我运行此代码时,它似乎可以分叉炸弹系统,你们可以帮助我吗?我想做的就是为每个appWatch域和环境启动一个线程。
#!/usr/bin/perl
#
#
# Starts the mass processes to watch each directory & enviroment.
#
#
#
###################################################################################
use strict;
use warnings;
use POSIX 'setsid';
setsid();
my @domains = (qw(austin batman luke heman drevil joker skeltor drevil goodguy badguy));
my @envs = (qw(qa dev));
foreach my $env (@envs){
foreach my $guy (@domains){
unless(my $pid = fork()){
system("echo $env.$guy");
system("sleep 10 ");
#system("./appWatch -d $guy -e $env");
open PID, ">>pid.lock";
print PID $$ . "\n";
print "$$ is Parent, $pid is child";
}
}
}
wait();
答案 0 :(得分:3)
您的代码应该只创建三个孩子。如果您看到正在创建一堆子项,那么您运行的是不同的代码(或者罪魁祸首是appWatch
而不是您的代码)。在一个稍微不相关的说明中,有几件事你应该采取不同的做法:
fork
有三个可能的返回值,而不是两个exec
而不是系统system
和exec
的多参数版本而不是一个参数版本。以下是我的代码版本:
$SIG{CHLD} = "IGNORE"; #auto-reap the children
my @domains = qw(domains);
my @envs = qw(enviromentA enviromentB);
for my $env (@envs){
for my $guy (@domains){
die "could not fork: $!" unless defined(my $pid = fork);
next if $pid;
exec "./appWatch", "-d", $guy, "-e", $env;
die "exec must have failed";
}
}
您更新的代码版本显示了发生的事情。你的孩子不会退出。以下是我编写代码的方法:
#!/usr/bin/perl
# Starts the mass processes to watch each directory & enviroment.
use strict;
use warnings;
use POSIX 'setsid';
setsid();
my @domains = qw(
austin batman luke heman
drevil joker skeltor drevil
goodguy badguy
);
my @envs = qw(qa dev);
my @pids;
for my $env (@envs){
for my $guy (@domains){
die "could not fork: $!" unless defined(my $pid = fork);
if ($pid) {
push @pids, $pid;
next;
}
print "$env.$guy\n";
sleep 10; #FIXME: I don't know if you really need this
#exec will replace the child process with appWatch
exec "./appWatch", "-d", $guy, "-e", $env;
die "exec failed for some reason";
}
}
for my $pid (@pids) {
waitpid $pid, 0;
}
答案 1 :(得分:1)
使用
$ cat appWatch #! /usr/bin/perl -l print "[", join("][" => @ARGV), "]";
在
上运行$ uname -a Linux mybox 2.6.32-24-generic #39-Ubuntu SMP Wed Jul 28 05:14:15 UTC 2010 x86_64 GNU/Linux
我没有fork
炸弹,只是一个令人兴奋的笛卡尔积:
$ ./prog.pl [-d][domains][-e][enviromentA] [-d][domains][-e][enviromentB]