Perl 단위 테스트에서 포킹 하위 프로세스가 입증됩니다. 시험 :: 하네스 종료

StackOverflow https://stackoverflow.com/questions/183560

문제

Perl 유틸리티/모듈을 일부 단위 테스트의 테스트 하네스로 사용하려고 노력했습니다. 장치 테스트는 다음을 사용하여 테스트의 일부로 일부 배경 프로세스를 포크해야하므로 "단위"보다 약간 더 "시스템"입니다.

sub SpinupMonitor{
   my $base_dir = shift;
   my $config = shift;

   my $pid = fork();
   if($pid){
      return $pid;
   }else{
      my $cmd = "$base_dir\/..\/bin\/monitor_real.pl -config $config -test";
      close STDOUT;

      exec ($cmd) or die "cannot exec test code [$cmd]\n";
   }
}

sub KillMonitor{

   my $pid = shift;

   print "Killing monitor [$pid]\n";
   kill(1,$pid);
}

그러나 어떤 이유로 .T 파일이 몇 가지 추가 프로세스를 회전시킬 때는 다음 파일로 진행하거나 종료하기보다는 모든 테스트가 완료된 후 첫 .T 파일의 끝에 테스트 하네스가 매달려 야합니다. 하나만있는 경우.

처음에 나는 하위 프로세스를 죽이고 소멸 상태로 남겨두기 때문에 그것이 될지 궁금했습니다. 그래서 나는 추가했다 ..

$SIG{CHLD} = \&REAPER;
sub REAPER {
   my $pid = wait;
   $SIG{CHLD} = \&REAPER;
}

코드에. 그러나 그것은 도움이되지 않습니다. 실제로 폐쇄 검사에서는 내 Perl 테스트 파일이 종료되었으며 이제는 소멸 된 과정이며 자식을 거두지 못한 래퍼 스크립트입니다. 사실 테스트 스크립트의 끝에서 다이 () 호출을 추가했을 때 나는 ...

# Looks like your test died just after 7.

그래서 내 스크립트는 종료되었지만 어떤 이유로 든 하네스가 풀리지 않습니다.

테스트가 실패한 동안 하네스가 제대로 빠져 나간 동안 비활성화했을 때와 같이 화를내는 것이 내 하위 프로세스임을 확인했습니다.

어떤 식 으로든 하네스를 화나게 할 수있는 프로세스를 시작하는 방식으로 내가 잘못하고있는 일이 있습니까?

감사

베드로

도움이 되었습니까?

해결책

시험을 떠나기 전에 모든 아이들이 종료했다고 가정하고 있습니까? 그렇지 않으면 Stderr에 매달려있을 수 있습니다. STDERR을 닫거나 부모 프로세스의 파이프로 리디렉션 할 수 있다면, 이는 하나의 문제 일 수 있습니다.

그 외에도 앞으로 슬래시를 피할 필요가 없으며 쉘 메타 카라 터를 사용하지 않는 경우 (공간은 Metacharacters가 Perl -Think”라고 지적합니다.*?{}()"), 당신은 명시적이고 목록을 만들어야합니다.

use File::Spec;
my @cmd = File::Spec->catfile($basedir,
                              File::Spec->updir(),
                              qw(bin monitor_real.pl)
                             ),
          -config => $config,
          -test   =>;

close STDOUT;
close STDERR;

exec (@cmd) or die "cannot exec test code [@cmd]\n";

다른 팁

여부를 테스트하지 않습니다 fork() 실패한. 당신은 확인해야합니다 $pid ~이다 한정된 "거짓"을 가정하기 전에 "자식"을 의미합니다.

당신의 $cmd 쉘 metacharacters (공간)가 포함되어 있고, Perl은 실제로 전화 할 때 쉘을 사용하고 있습니다. exec(). 모니터가 실행되는 동안 (1) Perl, (2) 어린이가 있습니다. sh -c, 및 (3) 손자 Perl 달리기 monitor_real.pl. 특히 의미하는 바는 당신이 전화 할 때입니다 KillMonitor, 당신은 모니터가 아니라 껍질을 죽이고 있습니다 (당신이 가지고있는 PID이기 때문에).

당신은 또한 관심이있을 수 있습니다 데몬 프로세스를 어떻게 포크합니까? Perl FAQ에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top