Я пытаюсь использовать служебную программу/модуль 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 вышел из строя и теперь является несуществующим процессом, и это завершающая оболочка script, которая не получила своего ребенка. Фактически, когда я добавил вызов die() в конце моего теста script, я получил...
# Looks like your test died just after 7.
Итак, мой script вышел, но по какой-то причине жгут не распутывается.
Я действительно подтвердил, что это, безусловно, мои подпроцессы, которые его нарушают, когда я отключил их, пока тесты не удалили надлежащую проводку.
Есть ли что-то, что я делаю неправильно с тем, как я запускаю свои процессы, которые могут каким-то образом нарушить упряжь?
Спасибо
Петр