그래서이 코드를 실행하면 폭탄을 터뜨린 것처럼 보일 수 있습니다. 여러분이 도와 주실 수 있습니까? 내가 원하는 것은 appWatch 도메인과 환경 각각에 대한 스레드를 시작하는 것입니다.Perl : 왜 이것이 수천 개의 하위 프로세스를 생성합니까?
$ ./prog.pl [-d][domains][-e][enviromentA] [-d][domains][-e][enviromentB]
그래서이 코드를 실행하면 폭탄을 터뜨린 것처럼 보일 수 있습니다. 여러분이 도와 주실 수 있습니까? 내가 원하는 것은 appWatch 도메인과 환경 각각에 대한 스레드를 시작하는 것입니다.Perl : 왜 이것이 수천 개의 하위 프로세스를 생성합니까?
$ ./prog.pl [-d][domains][-e][enviromentA] [-d][domains][-e][enviromentB]
귀하의 코드 만 작성해야합니다 세 어린이 :
#!/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();
$ cat appWatch #! /usr/bin/perl -l print "[", join("][" => @ARGV), "]";
난, 그냥 재미 없어 직교 제품에는 fork
폭탄을 얻을
$ uname -a Linux mybox 2.6.32-24-generiC#39-Ubuntu SMP Wed Jul 28 05:14:15 UTC 2010 x86_64 GNU/Linux
에서 실행으로 . 여러 개의 자식이 생성 된 것을보고 있다면 다른 코드를 실행하고 있습니다 (또는 코드가 아닌 appWatch
). 약간 관련이 메모에서, 당신은 아마 다른 일을해야 몇 가지가 있습니다 :
fork
이 세 가지 반환 값을 가지고하지 두system
의 버전과 exec
를 사용해야하는 코드를 반환하지 않으려면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;
}
시스템을 업그레이드하면 최신 코드가 표시됩니다. 그 본질적으로 그냥. IT는 일반적으로 나던하지만 몇 가지 이유로 수천 개의 프로세스를 시작합니다. –
Ok 일단 시스템을 백업하면 오류 코드를 게시하지만 귀하는 훌륭하게 작동합니다. 감사! 내 두 번째 질문은 할 수 있다면, 어떻게하면이 스크립트가 죽으면 모든 자식을 죽일 수 있도록 만들 수 있습니까? –
@Nerdatastic @ 맨 처음부터 배열에서 자식 IP를 모두 기억하고'END {kill 15, @pids}'를'kill '하기 위해'END' 블록을 사용할 수 있습니다. –
방금 시스템을 추락시킨 코드를 업데이트했습니다. 지금은 수정 된 솔루션을 사용하고 있습니다. –