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