[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