Script pour parser fichier txt

Fermé
encarnado Messages postés 4 Date d'inscription mardi 30 octobre 2012 Statut Membre Dernière intervention 30 octobre 2012 - Modifié par encarnado le 30/10/2012 à 11:06
encarnado Messages postés 4 Date d'inscription mardi 30 octobre 2012 Statut Membre Dernière intervention 30 octobre 2012 - 30 oct. 2012 à 14:24
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.

A voir également:

3 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
30 oct. 2012 à 11:19
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
0
encarnado Messages postés 4 Date d'inscription mardi 30 octobre 2012 Statut Membre Dernière intervention 30 octobre 2012
30 oct. 2012 à 11:29
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.
0
encarnado Messages postés 4 Date d'inscription mardi 30 octobre 2012 Statut Membre Dernière intervention 30 octobre 2012
Modifié par encarnado le 30/10/2012 à 11:54
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.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 30/10/2012 à 12:12
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
0
encarnado Messages postés 4 Date d'inscription mardi 30 octobre 2012 Statut Membre Dernière intervention 30 octobre 2012
30 oct. 2012 à 14:24
Normalement c'est exactement ça. Un grand merci pour ton aide.
0