tuto:linux:script_timeout_en_shell
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| tuto:linux:script_timeout_en_shell [2010/01/22 22:18] – root | tuto:linux:script_timeout_en_shell [2013/03/12 22:13] (Version actuelle) – root | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ====== Timeout en SHELL ====== | ====== Timeout en SHELL ====== | ||
| - | < | + | **timeout.sh** |
| + | < | ||
| #!/bin/sh | #!/bin/sh | ||
| Ligne 51: | Ligne 52: | ||
| } | } | ||
| - | watchit $1& a=$! | + | watchit $1& a=$! #start the timeout |
| - | shift #first param was timeout for sleep | + | shift |
| - | trap " | + | trap " |
| - | " | + | (" |
| - | kill -ALRM $a #send ALRM signal to watchit | + | kill -ALRM $a |
| - | wait $a #wait for watchit to finish cleanup | + | wait $a |
| - | exit $RET #return the value | + | exit $RET |
| </ | </ | ||
| - | Un autre un peu moins optimisé : | + | ./ |
| - | < | + | Un autre script s' |
| + | < | ||
| #!/bin/bash | #!/bin/bash | ||
| - | + | ||
| - | timeout=$1 | + | dir_result="/ |
| - | command=$2 | + | |
| - | shift 2 | + | declare -a command |
| - | + | ||
| - | check_pid_name() { | + | usage() { |
| - | | + | |
| - | | + | |
| - | [ -d / | + | |
| - | [ $(grep -c $command / | + | |
| } | } | ||
| - | + | ||
| - | [ -z " | + | kill_proc() { |
| - | + | | |
| - | safe_run() { | + | [ -d /proc/$pid ] && [ `grep $0 /proc/${pid}/ |
| - | | + | done |
| - | shift | + | |
| - | $command | + | |
| - | kill $$ | + | |
| - | } | + | |
| - | + | ||
| - | safe_run | + | |
| - | childpid=$! | + | |
| - | sleep $timeout | + | |
| - | + | ||
| - | check_pid_name $command $childpid && | + | |
| - | kill $childpid | + | |
| - | sleep 0.1 | + | |
| - | check_pid_name $command $childpid | + | |
| - | | + | |
| } | } | ||
| + | |||
| + | while getopts :h OPTION | ||
| + | do | ||
| + | case " | ||
| + | h) | ||
| + | usage | ||
| + | ;; | ||
| + | esac | ||
| + | done | ||
| + | |||
| + | |||
| + | nb_arg=`echo " | ||
| + | |||
| + | [ ! -d $dir_result ] && mkdir -p " | ||
| + | |||
| + | echo "Table des processus :" | ||
| + | |||
| + | for ((i=1; i< | ||
| + | do | ||
| + | log=`expr $i - 1` | ||
| + | cmd=`echo " | ||
| + | |||
| + | command[${# | ||
| + | |||
| + | if [ `echo " | ||
| + | timeout=`echo " | ||
| + | fi | ||
| + | |||
| + | if [ -z $timeout ] ; then | ||
| + | ( | ||
| + | $cmd 2>&1 1> | ||
| + | ret=$? | ||
| + | sleep 0.1 | ||
| + | echo "$! : Fait ($ret)" | ||
| + | [ $ret -ne 0 ] && exit 1 | ||
| + | ) & | ||
| + | else | ||
| + | ( | ||
| + | `dirname $0`/ | ||
| + | ret=$? | ||
| + | sleep 0.1 | ||
| + | if [ $ret -eq 0 ] ; then | ||
| + | echo "$! : Fait ($ret)" | ||
| + | else if [ $ret -eq 124 ] ; then | ||
| + | echo "$! : Timeout" | ||
| + | exit 1 | ||
| + | else | ||
| + | echo "$! : Fait($ret) !" | ||
| + | exit 1 | ||
| + | fi | ||
| + | fi | ||
| + | ) & | ||
| + | |||
| + | unset timeout | ||
| + | fi | ||
| + | |||
| + | command_pid[${# | ||
| + | done | ||
| + | |||
| + | for i in ${!command[*]} | ||
| + | do | ||
| + | if [ `echo ${command[i]} | awk '{ print $1 }' | grep " | ||
| + | echo " | ||
| + | else | ||
| + | echo " | ||
| + | fi | ||
| + | done | ||
| + | |||
| + | echo "" | ||
| + | |||
| + | trap ' | ||
| + | |||
| + | wait | ||
| + | |||
| + | for i in ${!command[*]} | ||
| + | do | ||
| + | [ -f " | ||
| + | done | ||
| </ | </ | ||
| - | ./script 2 sleep 4 | + | |
tuto/linux/script_timeout_en_shell.1264198737.txt.gz · Dernière modification : de root
