perl testing fork die perl-prove

Los subprocesos de bifurcación en las pruebas de la unidad Perl detienen la prueba; Prueba:: Salida del arnés



testing fork (2)

Supongo que todos sus hijos se han marchado antes de dejar la prueba. Porque de lo contrario, puede estar aferrado a STDERR, lo que puede confundir probar. Si puede cerrar STDERR, o al menos redirigir a un conducto en su proceso principal, ese puede ser un problema que tenga.

Además de eso, también le diría que no necesita escapar barras diagonales, y si no está utilizando metacaracteres del shell (los espacios no son metacaracteres para perl - piense en " *?{}() "), Debería ser explícito y crear una lista:

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";

He intentado usar la utilidad / módulo de Perl "probar" como un arnés de prueba para algunas pruebas unitarias. Las pruebas unitarias son un poco más de "sistema" que de "unidad" ya que necesito desviar algunos procesos en segundo plano como parte de la prueba, usando lo siguiente ...

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); }

Sin embargo, por alguna razón, cuando hago que mi archivo .t genere algunos procesos adicionales, hace que el arnés de prueba se cuelgue al final del primer archivo .t una vez finalizadas todas las pruebas, en lugar de pasar al siguiente archivo o al salir si solo hay uno

Al principio me pregunté si podría ser porque estaba matando mis subprocesos y dejándolos difuntos. Así que agregué ...

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

Para el código. Pero eso no ayuda. De hecho, en el examen cerrado resulta que mi archivo de prueba perl ha salido y ahora es un proceso difunto y es el guión de prueba de envoltura que no ha cosechado su hijo. De hecho, cuando agregué una llamada a die () al final de mi script de prueba, obtuve ...

# Looks like your test died just after 7.

Así que mi script salió pero por alguna razón el arnés no se está deshaciendo.

Confirmé que definitivamente son mis subprocesos los que están molestando, como cuando los deshabilité mientras las pruebas fallaban, el arnés salió correctamente.

¿Hay algo que estoy haciendo mal con la forma en que estoy iniciando mis procesos que podría alterar el arnés de alguna manera?

Gracias

Peter


Tenga en cuenta que no prueba si fork() falló. $pid asegurarse de que $pid esté definido antes de suponer que "falso" significa "hijo".

Debido a que $cmd contiene metacaracteres de shell (espacios), Perl está realmente usando un shell cuando se llama a exec() . Mientras su monitor se está ejecutando, hay (1) Perl, (2) un niño sh -c , y (3) un nieto Perl ejecutando monitor_real.pl . Lo que eso significa en particular es cuando llamas a KillMonitor , solo estás KillMonitor el shell (porque ese es el PID que tienes) y no el monitor.

Usted también podría estar interesado en ¿Cómo preparo un proceso de daemon? de las preguntas frecuentes de Perl.