Limitando el Tiempo de un Proceso

En el siguiente ejemplo utilizamos esta estrategia para saber sobre la conectividad de una máquina. El comando ping nos permite conocer los tiempos de respuesta. La opción -c 1 limita el número de paquetes de prueba a uno. Veamos un ejemplo de uso del comando ping:
$ ping -c 1  instituto
PING instituto (193.145.130.147): 56 data bytes
64 bytes from 193.145.130.147: icmp_seq=0 ttl=63 time=0.7 ms

--- instituto ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.7/0.7/0.7 ms
En este otro ejemplo vemos como es una respuesta negativa:
$ ping -c 1  thatmachine
PING thatmachine (193.145.125.192): 56 data bytes

--- thatmachine ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
Supongamos que pueda ocurrir que el comando que estamos lanzando, en este caso ping, en ocasiones no termine. En el siguiente ejemplo se muestra como limitar el tiempo de espera por ping y eliminar la jerarquía de procesos creada.
lhp@nereida:~/Lperl/src$ cat -n myping2.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3
 4  my @machines = @ARGV;
 5  my ($m, $code) = ("", "");
 6
 7  local $SIG{ALRM} = sub { die "too long"; };
 8
 9  for $m (@machines) {
10    eval {
11      alarm(1);
12      $code = `ping -c 1 $m`;
13      alarm(0);
14    };
15    if (defined($@) and ($@ =~ /too long/)) {
16      print "El acceso a $m toma demasiado tiempo.\n";
17      system('ps -fA | grep ping');
18
19      print "*************************\n";
20      local $SIG{HUP} = 'IGNORE';
21      kill 'HUP', -$$;
22      system('ps -fA | grep ping');
23    }
24    else {
25      print "From $m:\ncode = $code\n\n";
26    }
27  }
Al ejecutar el programa obtenemos una salida como esta:
lhp@nereida:~/Lperl/src$ ./myping2.pl www.google.com beowulf www.yahoo.com
From www.google.com:
code = PING www.l.google.com (209.85.129.104): 56 data bytes
64 bytes from 209.85.129.104: icmp_seq=0 ttl=240 time=73.0 ms

--- www.l.google.com ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 73.0/73.0/73.0 ms


El acceso a beowulf toma demasiado tiempo.
lhp       2430  8353  0 15:32 pts/14   00:00:00 vi myping2.pl
lhp       5513 31559  1 16:07 pts/15   00:00:00 /usr/bin/perl -w ./myping2.pl \
                                           www.google.com beowulf www.yahoo.com
lhp       5515  5513  0 16:07 pts/15   00:00:00 ping -c 1 beowulf
lhp       5516  5513  0 16:07 pts/15   00:00:00 sh -c ps -fA | grep ping
lhp       5518  5516  0 16:07 pts/15   00:00:00 grep ping
*************************
lhp       2430  8353  0 15:32 pts/14   00:00:00 vi myping2.pl
lhp       5513 31559  1 16:07 pts/15   00:00:00 /usr/bin/perl -w ./myping2.pl \
                                           www.google.com beowulf www.yahoo.com
lhp       5515  5513  0 16:07 pts/15   00:00:00 [ping] <defunct>
lhp       5519  5513  0 16:07 pts/15   00:00:00 sh -c ps -fA | grep ping
lhp       5521  5519  0 16:07 pts/15   00:00:00 grep ping
From www.yahoo.com:
code = PING www.yahoo-ht3.akadns.net (69.147.114.210): 56 data bytes
64 bytes from 69.147.114.210: icmp_seq=0 ttl=46 time=148.3 ms

--- www.yahoo-ht3.akadns.net ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 148.3/148.3/148.3 ms

Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19