Script pour parser fichier txt [Fermé]

Signaler
Messages postés
4
Date d'inscription
mardi 30 octobre 2012
Statut
Membre
Dernière intervention
30 octobre 2012
-
Messages postés
4
Date d'inscription
mardi 30 octobre 2012
Statut
Membre
Dernière intervention
30 octobre 2012
-
Bonjour,

Alors voila mon problème, je doit faire un script pour le monitorage d'un serveur apache.
Je fait exécuter à mon script la commande "apachectl fullstatus" enregistre la sortie dans un fichier txt jusque la tout va bien. Le problème est après je doit parser ce fichier et récupérer des données et les affectés à des variables.

Voila ce que j'ai besoin de récupérer :

.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

En gras les valeurs que je doit récupérer (qui bien sur ne sont pas toujours les mêmes) et en souligner les chaînes de recherche que je m'étais fixé.

Niveau code j'avais commencer un petit truc mais j'ai des doutes pour la recherche. Voila mon code pour le début :

#!C:\Perl\bin -w


# ========================================
# Execution de la commande et enregistrement du resultat dans un fichier

my $commande = "apachectl fullstatus";
my $resultat = '$commande > resultat.txt';
print $resultat;
close "resultat.txt";

my $file = "resultat.txt";
open FICHIER,"<$file";

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

my $substring = "requests/sec";
my $reqpsec;
while ($_ = <FILE>){
if ( $_ =~ /\s(\d+\s$substring)/ )
{
$reqpsec == $1;
}
print $reqpsec;
}

pour l'instant je n'en suis qu'au premier paramètre.

Merci de votre aide.

3 réponses

Messages postés
5578
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 juin 2021
937
Salut encarnado,

Ton script a de nombreux problèmes.

Entre autres :

- il ne récupère pas le résultat de apachectl fullstatus
- il ne crée aucun fichier avec quoi que ce soit dedans
- il utilise un descripteur de fichier "FILE" ne correspondant à aucun fichier ouvert
- il recherche "octobre" ?
- en tout état de cause cela ne serait pas if ( $_ =~ /\s(\d+\s$substring)/ ) mais plutôt if ( /\s(\d+\s$substring)/ ) mais je ne comprend pas ce que tu captures et cela ne correspond certainement pas à ce que tu dois récupérer
- == est l'opérateur d'égalité, pour l'affectation, c'est $reqpsec = $1;
- etc.

Si apachectl est dans le path, et que tu n'as pas besoin de stocker la sortie de la commande dans un fichier pour un autre usage, tu peux récupérer le résultat de la commande dans $_ et procéder comme cela :

#!/usr/bin/perl

use strict;
use warnings;

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

if ( /([.0-9]+)\srequests\/sec\s-\s([0-9]+)\sB\/second.*/ )
{
    $req_sec = $1;
    $b_sec = $2;
    print "J'ai trouvé : req_sec = $req_sec et b_sec = $b_sec\n";
} else
{
    print "Erreur : req_sec / b_sec introuvables\n";
}

C'est une base de travail, mais je crois que tu as sérieusement besoin de revoir les bases de Perl.


Dal
Messages postés
4
Date d'inscription
mardi 30 octobre 2012
Statut
Membre
Dernière intervention
30 octobre 2012

Merci de ton aide. Le problème c'est que je n'ai pas de bases perl j'ai lu des cours sur le net mais c'est tout et il faut que je fasse ce script d'ici la semaine prochaine.

Pour octobre j'ai éditer pour remettre la bonne recherche (pour tester en local sur mon poste je remplace la commande apache par un ipconfig /all).

En tout cas le script que tu me propose me permet de mieux comprendre ce que je doit faire, je vais faire avec ça et posterais d'une fois que j'aurais avancer pour les dernières correction.

Encore merci de tona ide.
Messages postés
4
Date d'inscription
mardi 30 octobre 2012
Statut
Membre
Dernière intervention
30 octobre 2012

Suite au retour de DAL j'ai corrigé mon script (en gras les points pour lesquels je pense que c'est faux) alors ça donne :

#!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\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 ( /\scache usage :\s([0-9]+)\s%/ )
{
$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/ ) # ici je doit récupéré le hostname et le OK de la ligne suivante : ajp hostname Init Ok 1 0 0 0 0
{
$hostname = $1;
$status = $2;
if ($status = "OK")
{
$status = 1;
} else
{
$status = 0;
}

} else
{
print "Erreur : hostname / status introuvables\n";
}

Merci de vos réponses.
Messages postés
5578
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 juin 2021
937
Il faut tester tes regexp sur la véritable sortie de la commande.

Sur la base de ce que tu as donné, on dirait que tu dois plutôt faire :

/([0-9]+)\srequests currently being processed,\s([0-9]+)\sidle workers/ 
/cache usage:\s([.0-9]+)%/ 
/ajp\s([^\s]+)\sInit\s([^\s]+)\s\d\s\d\s\d\s\d\s\d/

teste cela, ou adapte selon ta sortie réelle : https://perldoc.perl.org/perlretut


Dal
Messages postés
4
Date d'inscription
mardi 30 octobre 2012
Statut
Membre
Dernière intervention
30 octobre 2012

Normalement c'est exactement ça. Un grand merci pour ton aide.