Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Web
Web Toutes vos questions sur la construction de pages web en Perl (CGI, Ajax, mod_perl, sessions, ...) Avant de poster, veuillez consulter les FAQs perl, les cours Perl et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 29/10/2012, 11h14   #1
encarnado
Invité de passage
 
Homme Stéphane
Ingénieur Systèmes Réseaux et Supervision
Inscription : octobre 2012
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Systèmes Réseaux et Supervision

Informations forums :
Inscription : octobre 2012
Messages : 11
Points : 1
Points : 1
Par défaut Script Perl pour Apache

Bonjour à tous,

Alors voila je vous explique, je doit pour le boulot créer un script Perl pour superviser un serveur Apache or je ne connais pas encore Perl et le script doit être fait rapidement, je recherche donc une âme charitable qui aurait déjà une base de script et qui pourrais me le passer.

Voilà ce dont j'ai besoin :
-faire un script perl qui lance la commande "apachectl fullstatus", parse sa sortie, et récupère les infos suivantes :
-nombre de requêtes par sec
-nombre d'octets par sec
-nombre de workers actifs et idle, calcul du pourcentage de workers occupés
-pourcentage d'utilisation du cache ssl
-état de chaque membre d'un loadbalancer, où OK = 0 et not OK = 1

Merci par avance à ceux qui pourront m'aider.
encarnado est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2012, 15h30   #2
encarnado
Invité de passage
 
Homme Stéphane
Ingénieur Systèmes Réseaux et Supervision
Inscription : octobre 2012
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Systèmes Réseaux et Supervision

Informations forums :
Inscription : octobre 2012
Messages : 11
Points : 1
Points : 1
Par défaut Complément

J'ai réalisé un petit draft pour donner l'idée générale de ce que je veux faire :

Sachant que pour l'instant je n'arrive pas à voir comment transférer le résultat de ma commande dans un fichier.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# Algorithme pour script apache
 
Execute commande "apachectl fullstatus" >> $resultat
 
Open FICHIER ">resultat.txt"
 
print FICHIER "$resultat"
 
Close FICHIER
 
==============================
# Premier test : nombres de requêtes par seconde
 
Open FICHIER "<resultat.txt"
 
Find X "requests/sec"
$X=X
opcmon opcmon MAPOLICY=$X -option requestspsec=$X
 
Close FICHIER
 
==============================
# Deuxième test : nombre d'octets par seconde
 
Open FICHIER "<resultat.txt"
 
Find Y "B/second"
$Y=Y
opcmon MAPOLICY=$Y -option bpsecond=$Y
 
Close FICHIER
 
=============================
# Troisième test : nombre de workers actif et d'idle, et pourcentage de workers occupés
 
Open FICHIER "<resultat.txt"
 
Find W "requests currently being processed," I "idle workers"
$W=W
$I=I
 
$Z=($W*100)/($W+$I)
 
opcmon MAPOLICY=$Z -option pourcentworkersoccupes=$Z -option workersactifs=$W -option idle=$I
 
Close FICHIER
 
=============================
#Quatrième test : pourcentage utilisation cache ssl
 
Open FICHIER "<resultat.txt"
 
Find "cache usage:" V"%"
$V=V
opcmon MAPOLICY=$V -option cacheusage=$V
 
Close FICHIER
 
=============================
#Cinquième test : etats des membres du loadbalancer
 
Open FICHIER "<resultat.txt"
 
Find "ajp" R S
$R=R
$S=S
 
If ($S=OK
	Then $S=1)
else ($S=0)
 
opcmon MAPOLICY=$S -option name=$R -option state=$S
 
Close FICHIER
encarnado est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2012, 15h44   #3
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 494
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 494
Points : 676
Points : 676
Envoyer un message via ICQ à Gardyen
pour capturer la sortie d'une commande, tu peux utiliser les backsticks (cf la)
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2012, 15h47   #4
encarnado
Invité de passage
 
Homme Stéphane
Ingénieur Systèmes Réseaux et Supervision
Inscription : octobre 2012
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Systèmes Réseaux et Supervision

Informations forums :
Inscription : octobre 2012
Messages : 11
Points : 1
Points : 1
Merci du lien je pense qu'il me servira, au final j'ai trouver avec :
Code :
1
2
 
my $resultat = `$commande > resultat.txt`;
ça fonctionne maintenant les recherches vont être difficiles, je débute totalement en perl et quasiment en prog.
encarnado est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2012, 16h05   #5
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 494
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 494
Points : 676
Points : 676
Envoyer un message via ICQ à Gardyen
dans cette partie de la faq perl tu as comment parcourir un fichier

ensuite pour tester la chaine et rechercher des valeurs, les expressions régulières te seront utiles, voir les exemples ici

bon courage pour digérer tout cela !
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2012, 16h24   #6
encarnado
Invité de passage
 
Homme Stéphane
Ingénieur Systèmes Réseaux et Supervision
Inscription : octobre 2012
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Systèmes Réseaux et Supervision

Informations forums :
Inscription : octobre 2012
Messages : 11
Points : 1
Points : 1
Merci du coup de main à nouveau.
Ouai dur de tout digéré pour le début. Mais ça va bien finir par rentré.
Je vais regarder les liens que tu m'as donné et essayé jusqu'à ce que ça fonctionne.

Par contre est ce que c'est pareil pour par exemple j'ai :

"66 B/second" sachant que le 66 est un nombre qui peut varier et correspond au nombre que je veux capturer en gros on va dire que j'ai "X B/second" je vas faire ma recherche sur B/second comment je peux faire pour récupéré X et l'affecter à une variable?

Merci.
encarnado est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2012, 16h41   #7
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 494
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 494
Points : 676
Points : 676
Envoyer un message via ICQ à Gardyen
dans le 2e lien de mon précédent message il est indiqué comment récupérer un motif

En plus détaillé ça donne:
Code :
1
2
if ( $chaine =~ /\s(\d+\seuros)$/ ) {
 my $prix = $1;
Dans cet exemple, on recherche un espace, un nombre non nul (d'où le +) de chiffres (symbolisé par \d) puis un espace puis euros, en fin d'expression

Tu suis toujours ?

Pour capturer le groupe matchant \d+euros, on l'entoure d'une parenthèse.
La ligne suivante utilise la variable $1, dans laquelle est entrée la valeur du premier groupe matchant l'expression régulière. Si tu mets plusieurs groupes tu as $2 $3 etc.

De très nombreux tuto existent sur les expressions régulières de perl, bon courage !
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2012, 16h48   #8
encarnado
Invité de passage
 
Homme Stéphane
Ingénieur Systèmes Réseaux et Supervision
Inscription : octobre 2012
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Systèmes Réseaux et Supervision

Informations forums :
Inscription : octobre 2012
Messages : 11
Points : 1
Points : 1
J'avais vu dans la FAQ mais je n'avais rien compris alors que la déjà beaucoup plus.

Donc en gros dans mon cas ça donnerais :

if ( $chaine =~ /\s(\d+\sB/second)$/ ) {
my $prix = $1;
encarnado est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2012, 09h43   #9
encarnado
Invité de passage
 
Homme Stéphane
Ingénieur Systèmes Réseaux et Supervision
Inscription : octobre 2012
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Systèmes Réseaux et Supervision

Informations forums :
Inscription : octobre 2012
Messages : 11
Points : 1
Points : 1
Au final je suis arrivé à ça, est-ce que vus pensez que c'est bon?

my $commande = "ipconfig";
my $resultat = `$commande > resultat.txt`;
print $resultat;

my $file = "resultat.txt";
open (FILE, $file);

========================================
# Recherche du nombres de requêtes par seconde

my $substring = "requests/sec";

while (<FILE>) {
if ( $_ =~ /\s(\d+\s$substring)$/ ) {
my $reqpsec = $1; }
}
encarnado est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2012, 09h53   #10
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 494
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 494
Points : 676
Points : 676
Envoyer un message via ICQ à Gardyen
hum attention au $ en fin d'expression, il indique que ce que tu cherches doit se trouver à la fin de la ligne, je ne sais pas si c'est bien le cas pour toi

il te faut éplucher les tutos sur les expressions régulières, c'est inévitable vu la complexité du sujet.
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2012, 10h14   #11
encarnado
Invité de passage
 
Homme Stéphane
Ingénieur Systèmes Réseaux et Supervision
Inscription : octobre 2012
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Systèmes Réseaux et Supervision

Informations forums :
Inscription : octobre 2012
Messages : 11
Points : 1
Points : 1
Ouai je crois que je suis parti pour ça.

.0435 requests/sec - 66 B/second

1 requests currently being processed, 49 idle workers

index usage: 0%, cache usage: 0%

ajp hostname Init Ok 1 0 0 0 0


Voila en rouge ce que je veux récupérer dans des variables et en vert ce que je me suis défini comme chaîne pour ma recherche.

Si ça peut aider pour comprendre.
encarnado est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2012, 10h37   #12
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 494
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 494
Points : 676
Points : 676
Envoyer un message via ICQ à Gardyen
en gros voilà ce que je ferais, sachant que je suis très loin d'être expert en expressions régulières ^^

([\w\.]+) requests/sec - (\d+) B/second

(\d+) requests currently being processed, (\d+) idle workers

cache usage: (\d+)%

ajp (\w+) Init (\w+)
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2012, 10h48   #13
encarnado
Invité de passage
 
Homme Stéphane
Ingénieur Systèmes Réseaux et Supervision
Inscription : octobre 2012
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Systèmes Réseaux et Supervision

Informations forums :
Inscription : octobre 2012
Messages : 11
Points : 1
Points : 1
Ok donc ça donnerais un truc du genre :

my $substring = "requests/sec";
my $reqpsec;
while ($_ = <FILE>){
if ( $_ =~ ([\w\.]+)$substring/ )
{
$reqpsec == $1;
}
}
encarnado est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2012, 12h30   #14
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 494
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 494
Points : 676
Points : 676
Envoyer un message via ICQ à Gardyen
attention aux = ^^

Code :
1
2
3
4
5
6
7
8
my $substring = "requests/sec";
my $reqpsec;
while (<FILE>){
  if (([\w\.]+) $substring/ )
  {
    $reqpsec = $1;
  }
}
il y a un espace avant requests non ?
tu peux le préciser soit avec ' ' soit avec \s

ps: on peut omettre $_ qui est le plus souvent implicitement utilisé quand on ne précise pas de paramètres; sauf si tu préfères le mettre afin d'y voir plus clair
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2012, 14h27   #15
encarnado
Invité de passage
 
Homme Stéphane
Ingénieur Systèmes Réseaux et Supervision
Inscription : octobre 2012
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Systèmes Réseaux et Supervision

Informations forums :
Inscription : octobre 2012
Messages : 11
Points : 1
Points : 1
Au final j'ai trouvé une autre manière je la poste si des fois ça peut aider d'autres, je garde quand même tes conseils si des fois ça ne fonctionnait pas (je ne pourrais tester que lundi prochain). Un grand merci en tout cas pour ton aide.

Juste si des fois tu sais une dernière petite chose, pour la partie en gras rouge dans le script sur la fin. Je récupère un statut OK et je voudrais le transformer en 1 si OK ou en 0 sinon est-ce que mon if est bon?

#!C:\Perl\bin

use strict;
use warnings;

# ========================================
# Execution de la commande apachectl fullstatus et préparation pour l'analyse du résultat de la commande

my $exec = "apachectl fullstatus";
$_ = qx{$exec};
print "Resultat :\n$_\n";

# ========================================
# Recherche du nombres de requêtes par seconde et du nombres d'octets apr seconde

my $req_sec = "";
my $b_sec = "";

if ( /([.0-9]+)\srequests\/sec\s-\s([0-9]+)\sB\/second.*/ )
{
$req_sec = $1;
$b_sec = $2;

} else
{
print "Erreur : req_sec / b_sec introuvables\n";
}

# ========================================
# Recherche du nombre de workers actifs, du nombre d'idle et calcul du pourcentage de workers occupés

my $workers_actifs = "";
my $idle = "";
my $pourcentage_workers_occupes = "";

if ( /([0-9]+)\srequests currently being processed,\s([0-9]+)\sidle workers/ )
{
$workers_actifs = $1;
$idle = $2;
$pourcentage_workers_occupes = ($workers_actifs*100)/($workers_actifs+$idle);

} else
{
print "Erreur : workers_actifs / idle introuvables\n";
}

# ========================================
# Recherche du pourcentage de cache ssl

my $cache_ssl = "";

if ( /cache usage:\s([.0-9]+)%/ )
{
$cache_ssl = $1;

} else
{
print "Erreur : cache_ssl introuvables\n";
}

# ========================================
# Recherche de l'état des membres du loadbalancer

my $hostname = "";
my $status = "";

if ( /ajp\s([^\s]+)\sInit\s([^\s]+)\s\d\s\d\s\d\s\d\s\d/ )
{
$hostname = $1;
$status = $2;
if ($status = "OK")
{
$status = 1;
} else
{
$status = 0;
}

} else
{
print "Erreur : hostname / status introuvables\n";
}
encarnado est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2012, 15h49   #16
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 494
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 494
Points : 676
Points : 676
Envoyer un message via ICQ à Gardyen
pour tester l'égalité des chaînes de caractères, il faut utiliser eq (ou ne pour la différence)

Code :
1
2
3
4
5
6
7
if ($status eq "OK")
{
$status = 1;
} else
{
$status = 0;
}
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/10/2012, 16h10   #17
encarnado
Invité de passage
 
Homme Stéphane
Ingénieur Systèmes Réseaux et Supervision
Inscription : octobre 2012
Messages : 11
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Systèmes Réseaux et Supervision

Informations forums :
Inscription : octobre 2012
Messages : 11
Points : 1
Points : 1
Merci beaucoup de ton aide, maintenant résultat lundi prochain lors des tests.
encarnado est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h11.


 
 
 
 
Partenaires

Hébergement Web