[bcn-pm] timeout que no em mata el procés (+ pipes)
Arnau Bria
listsarnau a gmail.com
dim mar 27 03:59:26 PDT 2012
On Tue, 27 Mar 2012 01:36:34 +0200
Alex Muntada wrote:
Hola Àlex,
primer de tot dir-vos que no entenc perquè però amb TERM el procés
mor. ?¿?¿?¿ No ho entenc... Estic reutilitzant el codi que vaig enviar
la setmana passada i ara funciona:
$ perl exped.pl
ole tu
ole tu
19345 timeout
19357 timeout
mata el procés, no té zombies ni porcessos penjats que no moren..
204 10678 0.0 0.0 70300 1736 pts/0 S Mar26 0:00 | \_ -bash
204 19361 0.0 0.0 77860 1676 pts/0 S+ 12:32 0:00 | \_ perl exped.pl
Sigui com sigui, i seguint el consell d'en Carles, he canviat la senyal
per INT. (tornaré a investigar perquè no funcionava però per ara
continuo avançant).
> Si vols matar el process group el que ha de ser negatiu és el signal
> no el PID (e.g. kill -15 => $kidpid):
> http://perldoc.perl.org/functions/kill.html
Aleshores, això d'aquí:
http://perldoc.perl.org/perlipc.html#Signals
'Sending a signal to a negative process ID means that you send the
signal to the entire Unix process group'
no val? quina diferència hi ha entre els dos kills?
> Així doncs, té pinta que no estàs enviant el kill allà on tu
> pretenies. De fet, pots comprovar la sortida del kill per veure si
> s'ha lliurat el signal correctament.
He progressat amb el codi i ara el fill i el pare s'envien les coses
amb pipes. Us enganxo el codi perquè el critiqueu i us pregunto un
parell de coses:
# creating pipes for parent/child communication
pipe(READER, WRITER);
WRITER->autoflush(1);
# Fork
my ($pid,$ret);
if (!defined($pid = fork())) {
#fork returned undef, so failed
$log->info("Cannot fork: $! ... ");
die ;
} elsif ($pid == 0) {
# Child. We write, we close the reader
close READER;
setpgrp(0,0);
#Exec writes on STDOUT, we must redirect it to WRITER
STDOUT->fdopen( \*WRITER, 'w' ) or die $!;
exec("$command");
exit (0);
} else {
# so this branch is the parent. We READ we close the writer
close WRITER;
eval {
local $SIG{ALRM} = sub {kill 'SIGINT' => -$pid;waitpid ($pid,0);die "Timeout\n" };
alarm 5;
waitpid($pid, 0);
alarm 0;
};
if ($@) {
die unless $@ eq "Timeout\n"; #unexpected error
warn "$command timed out.\n";
$log->error("diagnose timed out... ");
$ret = waitpid($pid,0) || die "Unable to reap child $pid (ret=$ret) - $!";
$log->error("Monpetitami could not connect to maui server. Skiping MAUI data gathering: diagnosei timeout: $ret... ");
}else{
my $index;
my @diagnose=<READER>;
close READER;
[...]
#Parsing del output enviat pel fill
}
}
1.-) Veig que quan parlem de pipes tant el fill com el pare han de
tancar els dos pipes
(http://docstore.mik.ua/orelly/perl/cookbook/ch16_11.htm), però si faig
un exec, no puc fer un close després. M'estic deixant un descriptor
obert?
2.-) És més correcte fer un open ? (com diu la segona part del mateix
link).
com sempre, moltes gràcies per la vostra ajuda!!
> Salut!
salut!
Arnau
Més informació sobre la llista de correu Barcelona-pm