= Timeout.ksh = #!/bin/ksh ## ============================================================================================== ## TimeOut Command ## ============================================================================================== ## Nom du fichier : ./timeout.ksh temps commande paramètres ## ## ============================================================================================== ## Description : Attend que la commande se termine ## si la commande n est pas terminée après "temps" secondes ## la commande est "killée" ## ============================================================================================== #option -m : les background processes ont un pgid different set -m temps=$1 shift #Premier shell, la commande à lancer /bin/ksh -c " sleep 2 $* " & waitedPid=$! #Si le premier shell dure trop longtemps, il sera killé par le second /bin/ksh -c " sleep $temps >/dev/null 2>&1 kill -0 -$waitedPid && kill -15 -$waitedPid " & killerPid=$! #On attend donc la fin normale (ou provoquée) du 1er shell #Le code retour sera celui de la commande wait $waitedPid > /dev/null 2>&1 exitCode=$? #Si le premier shell s est terminé avant la second, on kill le second qui ne sert plus à rien #En fait, un exitCode > 127 ne survient qu après un kill, donc si l exitCode est inférieur, c est une fin "non killé" [[ $exitCode -le 127 ]] && >/dev/null 2>&1 kill -0 -$killerPid && kill -15 -$killerPid return $exitCode