OVH Cloud OVH Cloud

Watchdog sur une entrée "pipe"

2 réponses
Avatar
Yves Martin
Bonjour,

J'ai actuellement crée un script pour Nagios qui récupère des points de
mesures distants par une commande ssh pour les publier.

Mon problème:
- la connection ssh peut être lente à s'établir (voir l'option ssh
ConnectionTimeout)
- le flux peut être figé sans que la connection soit coupée

open(NEW, "ssh yma@test /home/yma/getValue.sh |");
while($line = <NEW>) {
# Traitement
}
close(NEW);

Mon script peut rester bloqué dans le 'while' si la connection est "bloqué".

Comme Nagios espère un résultat dans les 50 secondes, j'aimerai pouvoir
interrompre ma lecture du "pipe" avant ce délai fatidique pour retourner le
code UNKNOWN... (et éviter le CRITICAL - Service plugin timeout)

Ma question: comment mettre en place facilement un watchdog ou un délai
d'attente en lecture du <NEW> ?

Merci d'avance pour votre aide
Salutations,
--
Yves Martin

2 réponses

Avatar
DoMinix
Yves Martin wrote:
Bonjour,

J'ai actuellement crée un script pour Nagios qui récupère des points de
mesures distants par une commande ssh pour les publier.

Mon problème:
- la connection ssh peut être lente à s'établir (voir l'option ssh
ConnectionTimeout)
- le flux peut être figé sans que la connection soit coupée

open(NEW, "ssh /home/yma/getValue.sh |");
while($line = <NEW>) {
# Traitement
}
close(NEW);

Mon script peut rester bloqué dans le 'while' si la connection est "bloqué".

Comme Nagios espère un résultat dans les 50 secondes, j'aimerai pouvoir
interrompre ma lecture du "pipe" avant ce délai fatidique pour retourner le
code UNKNOWN... (et éviter le CRITICAL - Service plugin timeout)

Ma question: comment mettre en place facilement un watchdog ou un délai
d'attente en lecture du <NEW> ?

Merci d'avance pour votre aide
Salutations,


une piste, regarde du coté de SIGALRM
perldoc -f alarm
perldoc perlipc

@+

--
dominix

Avatar
Yves Martin
DoMinix writes:

une piste, regarde du coté de SIGALRM
perldoc -f alarm
perldoc perlipc


Merci beaucoup. Voici la solution pour ceux que ça intéresserait:

#!/usr/bin/perl

my $commandTimedout = 0;

eval {
$SIG{ALRM} = sub {
print "Time out !n";
$commandTimedout = 1;
die "command timed out";
};

alarm(2);

print "Starting command...n";

open(NEW, "sleep 40; echo 'data' |");
while(my $line = <NEW>) {
print $line;
}
alarm(0);
close(NEW);
};

print "Command timed out !n" if $commandTimedout;

--
Yves Martin