OVH Cloud OVH Cloud

Soumettre une commande en imposant un timeout ?

4 réponses
Avatar
kato fong
Bonjour,

Je suis en train d'écrire un script qui boucle en exécutant des
commandes plus ou moins complexes sur différents serveurs.
Il arrive que certaines commandes "se bloquent" pour des raisons très
diverses.
Je souhaite donc soumettre ces commandes en imposant un time-out afin de
pouvoir continuer à scruter les serveurs suivants si une commande ne
rend pas la main dans les délais.

Comment feriez-vous ?

D'avance merci pour vos réponses,

kato

4 réponses

Avatar
R12y
kato fong :

Comment feriez-vous ?


Je ferais un script par serveur.

--
My Debian/apt repo:
My Fedora/yum Repo:
http://www.locataire-serveur.info/sections/liens/fedora-core-yum

Avatar
lhabert
kato fong :

Je suis en train d'écrire un script qui boucle en exécutant des
commandes plus ou moins complexes sur différents serveurs.
Il arrive que certaines commandes "se bloquent" pour des raisons très
diverses.
Je souhaite donc soumettre ces commandes en imposant un time-out afin de
pouvoir continuer à scruter les serveurs suivants si une commande ne
rend pas la main dans les délais.


Quelque chose comme ça a l'air de marcher à peu près :

run_with_timeout () {
TIMEOUT=$1
shift
"$@"&
SON=$!
{ sleep "$TIMEOUT"; kill "$SON"; } &
KILLER=$!
wait "$SON"
kill "$KILLER"
}

. Éventuellement mettre des kill -9 à la place des kills. Ça a
l'inconvénient que ça laisse des sleep trainer si sleep n'est pas un builtin
du shell, et que si « $KILLER » meurt avant le « kill "$KILLER" », on a un
très léger risque de tuer un autre process qui se serait vu réaffecter le
même pid, enfin c'est pas très probable (utiliser supervise à la place si on
est parano).

Avatar
kato fong
R12y wrote:

Je ferais un script par serveur.

mmm...erci. Toutefois, j'ai besoin de comparer les données collectées

sur chaque serveur afin de réagir rapidement le cas échéant.
Si le script pN.sh qui scrute le serveur ServN se plante sans rendre la
main, mes données relatives à ServN ne seront pas mises à jour.

Je sais comment m'en sortir, mais ça devient assez lourd. C'est pour ça
que j'aurais aimé une commande, style sudo, time ou nohup, qui prend une
autre commande en argument en lui imposant un temps max d'exécution.

Avatar
kato fong
Luc Habert wrote:

Quelque chose comme ça a l'air de marcher à peu près :

run_with_timeout () {
TIMEOUT=$1
shift
"$@"&
SON=$!
{ sleep "$TIMEOUT"; kill "$SON"; } &
KILLER=$!
wait "$SON"
kill "$KILLER"
}


Effectivement, je trouve ça pas mal du tout.

. Éventuellement mettre des kill -9 à la place des kills. Ça a
l'inconvénient que ça laisse des sleep trainer si sleep n'est pas un builtin
du shell, et que si « $KILLER » meurt avant le « kill "$KILLER" », on a un
très léger risque de tuer un autre process qui se serait vu réaffecter le
même pid, enfin c'est pas très probable (utiliser supervise à la place si on
est parano).


merci également de m'avoir signalé supervise. ça peut aussi être une piste.

@+

kato