Question Nagios : Vérification de processus en cours

Plus d'informations
il y a 16 ans 4 mois #5529 par phil
Bonjour, je viens à vous en quête d'un peu d'aide, ou d'au moins une idée pour essayer de m'en sortir.

Je suis actuellement en stage pour l'installation d'un nouveau serveur nagios et à ce titre, mon tuteur de stage m'a demander d'actualiser les scripts que l'on trouve de base avec les démons et de les mettre en en powershell.

Bon je dois avouer que je suis nul en powershell, donc j'ai bien dû m'y mettre et faire pas mal de recherche.

Là j'ai déjà réussi quelques scriptes tels que le taux d'occupation mémoire ou disque ou bien encore CPU.

(comme quoi je ne viens pas les mains vides, j'ai déjà un peu bosser le sujet).

Voici un exemple de script qui vérifie tous les disques durs d'un serveur à monitorer:

[code:1]
##################################################################################
#
# Script Check-disk pour tous les disques physiques d'une machine
#
##################################################################################
#Sélection des disques locaux de la machine

$elements = get-wmiobject -class win32_logicaldisk |where-object {$_.drivetype -eq 3}

#Calcul du pourcentage d'espace libre restant (juste en exemple pour rappel)
#$freespace= (($objItem.FreeSpace*100)/$objItem.Size)

#Boucle \"foreach\" pour faire le calcul sur chaque disque trouvé dans la sélection faite au-dessus

foreach ( $disque in $elements ) {
$taille = ($disque.freespace*100) / $disque.size

#Calcul du pourcentage d'espace libre restant

$taille = [math]::round($taille, 1)
$nom=$disque.name


#Test ici du % toléré et envoie d'un code erreur correspondant

if ($taille -le 5) {
write-host \"$nom $taille\"
$host.SetShouldExit(2)
}

elseif ($taille -le 10) {
write-host \"$nom $taille\"
$host.SetShouldExit(1)
}

else {
write-host \"$nom $taille %\"
$host.SetShouldExit(0)
}
}
[/code:1]


Bon ça encore, ça pouvait aller.

Mais maintenant, je dois m'attaquer à la vérification de certains processus, à savoir s'ils sont bien lancés.

J'ai commencer un script, mais il ne marche pas comme je voudrais:

[code:1]
$services = get-service | where {$_.status -eq \"Running\"}

$verif = get-content C:\tests\testfile4.txt

Foreach ($_ in $verif)
{
if ($_.Name -eq $services.Name)
{ write-host \"$_ +\" }
else
{ write-host \"$_ -\" }
}
[/code:1]

Et c'est là que viennent les ennuis, dans mon ficier \"testfile4.txt\", j'ai mis 4 noms de processus, 2 qui sont en train de tourner sur mon ordi et 2 autres qui sont arrêtés.

Hors si je lance le script tel quel, voici le résultat:

Name : aide et support +
Name : Dhcp +
Name : Dnscache +
Name : DDE réseau +

Donc déjà le premier problème c'est qu'il les considère tous comme étant en mode \"running\", ce qui est faut :S

De plus, j'aimerai qu'à la fin de ma boucle, il m'indique tous les services sur une seule ligne, un peu dans ce genre ci:

Dhcp +, Dnscache +, DDE réseau -


Et que s'il n'a que des +, le script me renvoie ce code erreur:
[code:1]$host.SetShouldExit(0)[/code:1]
Sinon, c'est donc qu'il a un \"-\" quelque part et donc il devra renvoyer
[code:1]$host.SetShouldExit(2)[/code:1]

Voilà en espérant que vous ayez une petite idée pour que je puisse m'en sortir, je vais de mon côté, continuer à m'arracher les cheveux. :'(

Merci d'avance.<br><br>Message édité par: Arnaud, à: 12/11/09 00:41

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 4 mois #5531 par Laurent Dardenne
Salut,
Dingo écrit:

Bon je dois avouer que je suis nul en powershell, donc j'ai bien dû m'y mettre et faire pas mal de recherche.

Si cela peut te rassurer, au démarrage c'est pareil pour tout le monde, moi le premier :lol:.

Comment as-tu construit le fichier testfile4.txt ?
Un exemple de son contenu serait le bienvenue.

Ensuite l'approche de manipulation de texte n'est pas adapté à PowerShell, ainsi tu ne tires pas avantage de ce shell.
Il faut penser manipulation d'objet et pas manipulation de texte.

Dingo écrit:

De plus, j'aimerai qu'à la fin de ma boucle, il m'indique tous les services sur une seule ligne, un peu dans ce genre ci:

Il faut découpler le résultat de son affichage.
De cette manière tu peux envisager, au cas où, de relancer les services stoppés.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 4 mois #5547 par phil
Réponse de phil sur le sujet Re:Vérification de processus en cours
bonjour et merci pour la réponse, alors déjà, dans mon testfile, il ya juste les les noms de services du genre

xmlprov
Dhcp
Dnscache
Webclient
ose
MSDTC
CiSvc


Bon sinon j'ai un peu avancé dans mon schmilblick:
[code:1]
$verif = get-content C:\tests\testfile5.txt
Foreach ($_ in $verif)
{
$test = gwmi Win32_service -filter \&quot;name like '$_'\&quot; |where {$_.State -eq \&quot;Running\&quot;} | select name
if ($test -ne $null)
{
write-host \&quot;$test +\&quot;
}
else{
$test = gwmi Win32_service -filter \&quot;name like '$_'\&quot; |where {$_.State -eq \&quot;Stopped\&quot;} | select name
write-host \&quot;$test -\&quot;
}
}
[/code:1]
il me fait les bonnes réponses, juste l'affichage qui n'est pas top et je n'ai pas le résultat sur une seule ligne :s <br><br>Message édité par: Dingo, à: 30/10/09 15:33
Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 4 mois #5551 par Laurent Dardenne
Un réflexe Get-Help :
[code:1]Get-Help Write-Host -Full|More[/code:1]
Tu y trouveras la solution ;)

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 4 mois #5574 par phil
Réponse de phil sur le sujet Re:Vérification de processus en cours
Je ne sais pour quelle raison, mais ni le get-help, ni le get-member ne marche, enfin pas grave, le net sert à ça, donc merci pour l'indication, voici le petit script finit:
[code:1]
#Sélection du fichier texte dans lequel se trouve le nom des process à surveiller
$verif = get-content C:\tests\testfile1.txt

#Boucle \&quot;Foreach\&quot; pour faire le test pour chaque nom
Foreach ($_ in $verif)
{

#Variable test qui ressort tous les process en cours et qui les filtre par rapport au nom choisit dans la boucle et qui nous ressort en résultat le nom du process
$test = get-wmiobject win32_process -filter \&quot;name='$_.exe'\&quot; | select ProcessName

#Même variable mais écriture différente
#$test = Get-WMIObject -query \&quot;Select * From Win32_Process Where Name='$_.exe'\&quot; | select ProcessName

#Si un nom ressort (donc si ce qui ressort est différent de rien)
if ($test -ne $null)
{
#Affichage du nom recherché avec \&quot;+\&quot; pour indiquer que le process est bien lancé
write-host -NoNewline \&quot;$_ + / \&quot;
}

#Si rien n'est ressorti du filtre (affichage d'aucun nom par rappport à celui voulu) c'est donc que le process est arrêté
else{
#Affichage du nom recherché avec \&quot;+\&quot; pour indiquer que le process est arrêté
write-host -NoNewline \&quot;$_ - / \&quot;
}
}

#Renvoie d'un code erreur critique si un des résultat de $test n'a pas été trouvé ($null)
Foreach ($_ in $verif)
{
if ($test -eq $null)
{
# -&gt; write-host pour le test #
#write-host \&quot;critique\&quot;
$host.SetShouldExit(2)
}
#Si tous les services ont été trouvés alors renvoie d'un code erreur ok
else
{
# -&gt; write-host pour le test #
#write-host \&quot;ok\&quot;
$host.SetShouldExit(0)
}
}
[/code:1]

[code:1]
#Sélection du fichier texte dans lequel se trouve le nom des services à surveiller
$verif = get-content C:\tests\testfile5.txt

#Boucle \&quot;Foreach\&quot; pour faire le test pour chaque nom
Foreach ($_ in $verif)
{

#Variable test qui filtre les services dont l'état est \&quot;en cours\&quot; et qui le compare au nom de la boucle en cours.
$test = gwmi Win32_service -filter \&quot;name like '$_'\&quot; | where {$_.State -eq \&quot;Running\&quot;} | select name

#si le nom du service ressort bien de la variable
if ($test -ne $null)
{
#Affichage du nom recherché avec \&quot;+\&quot; pour indiquer qu'il est bien démarré
write-host -NoNewline \&quot;$_ + / \&quot;
}

#Sinon, si le service n'a pas été trouvé dans l'état \&quot;en cours\&quot;, on le cherche dans les services dont l'état est arrêté
elseif ($test2 = gwmi Win32_service -filter \&quot;name like '$_'\&quot; |where {$_.State -eq \&quot;Stopped\&quot;} | select name )
{

#Affichage du nom recherché avec \&quot;+\&quot; pour indiquer qu'il est bien arrêté
write-host -NoNewline \&quot;$_ - / \&quot;
}

#Si le service n'a pas été trouvé dans les états \&quot;en cours\&quot; ou \&quot;arrêté\&quot;, c'est que ce service n'est pas installé
else
{
#Affichage du nom recherché avec \&quot;X\&quot; pour indiquer qu'il n'est pas présent
Write-host -NoNewline \&quot;$_ X / \&quot;
}
}

#Renvoie d'un code erreur critique si un des résultat de $test n'a pas été trouvé ($null)
Foreach ($_ in $verif)
{
#Si durant cette boucle un service n'est pas trouvé, renvoie d'un code d'erreur critique
if ($test -eq $null)
{
# -&gt; write-host pour le test #
#write-host \&quot;critique\&quot;
$host.SetShouldExit(2)
}
#Sinon, si tous les services ont été trouvés alors renvoie d'un code erreur ok
else
{
# -&gt; write-host pour le test #
#write-host \&quot;ok\&quot;
$host.SetShouldExit(0)
}
}
[/code:1]<br><br>Message édité par: Dingo, à: 2/11/09 13:35

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 4 mois #5607 par Arnaud Petitjean
Salut Dingo et bienvenu dans le forum ! ;)

Juste pour ta culture, l'utilisation de la commande ForEach ne s'utilise pas tout à fait comme tu le fais...

Je m'explique par un petit exemple:

[code:1]
$machines = Get-content ./FicMachines.txt
Foreach ($machine in $machines)
{
...
}[/code:1]

Il ne faut pas ici utiliser le \&quot;$_\&quot; comme tu le fais.
Son usage se fait lorsque qu'on utilise Foreach avec le pipe.
Exemple :

[code:1]
1..10 | foreach {Write-host \&quot;Nombre $_\&quot; }
[/code:1]

Voilà, en espèrant que ça t'aide à améliorer tes scripts...

Sinon, juste pour ma culture que faut-il que tes scripts retournent comme valeurs pour que Nagios puisse les récupérer ? Un petit exemple serait le bienvenu.

A bientôt.

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.054 secondes
Propulsé par Kunena