miércoles, 7 de marzo de 2012

Ejecutar un SHELL script con TIMEOUT

En la vida de todo sysadmin en algun momento hay que lidiar con "malos programadores" de shell scripts. Un problema que surgió en mi laburo fue el de monitorear unos scripts que quedaban colgados por un tiempo mayor al esperado y generaban problemas en las ejecuciones posteriores. En realidad lo que sucedia era que un fs tenia 65.000 archivos y el script ejecutaba un "ls", quedando colgado. Por supuesto la solución mas facil hubiese sido agregar una rutina de depuración al fs para evitar juntar tanta basura.... pero no... es mejor matar el script que se colgó y despues forzar la ejecución (!!!!). En fin, un hack de pocas lineas con PERL para zafar y que seguramente puede ser mejorado.
#! /usr/bin/perl

eval {
        local $SIG{ALRM} = sub { die "Me voy por timeout\n" };
        alarm 5;
        system("@ARGV");
        alarm 0;
};

if ( $@ )
{ print "$@";exit 1; }
La idea es ejecutar el comando que se quiera controlar por timeout de la siguiente manera:
./alarm.pl sleep 100
Me voy por timeout