2010-08-18 3 views

답변

3

귀하의 코드 만 작성해야합니다 세 어린이 :

#!/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

Ok 일단 시스템을 백업하면 오류 코드를 게시하지만 귀하는 훌륭하게 작동합니다. 감사! 내 두 번째 질문은 할 수 있다면, 어떻게하면이 스크립트가 죽으면 모든 자식을 죽일 수 있도록 만들 수 있습니까? –

+0

@Nerdatastic @ 맨 처음부터 배열에서 자식 IP를 모두 기억하고'END {kill 15, @pids}'를'kill '하기 위해'END' 블록을 사용할 수 있습니다. –

+0

방금 ​​시스템을 추락시킨 코드를 업데이트했습니다. 지금은 수정 된 솔루션을 사용하고 있습니다. –

1

$ 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). 약간 관련이 메모에서, 당신은 아마 다른 일을해야 몇 가지가 있습니다 :

  1. fork이 세 가지 반환 값을 가지고하지 두
  2. 당신이 당신의 아이들을 수확하거나 그들을 수확하도록 시스템을 설정해야합니다 당신은 당신이 쉘을 원하지 않는 경우
  3. 가 대신 하나 개의 인수 버전의 여러 인수 system의 버전과 exec를 사용해야하는 코드를 반환하지 않으려면
  4. 대신 시스템의 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; 
} 
+0

시스템을 업그레이드하면 최신 코드가 표시됩니다. 그 본질적으로 그냥. IT는 일반적으로 나던하지만 몇 가지 이유로 수천 개의 프로세스를 시작합니다. –

관련 문제