Ваш код должен создавать только трех детей.Если вы видите, как создается группа детей, значит, вы запускаете другой код (или виновник 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;
}