Bonjour à tous
Pour tracer la consommation disque dur lors de l'exécution d'un logiciel de traitement d'images que l'on développe dans ma boîte, j'ai développé rapidement un petit script shell qui fait à intervalle régulier des "df" et exporte les résultats au format CSV.
De la même façon, pour tracer la consommation CPU j'utilise "top" en mode batch.
Dans les deux cas mes scripts marchent très bien mais je suis confronté à des difficultés :
- le parsing de la sortie des commandes "df" et "top" n'est pas évident… Si le nom du système de fichier est trop long, "df" saute une ligne. Le format de sortie de la commande "top" n'est pas le même selon la version et la machine, etc…
- le parsing à faire dépend de la langue
- on ne peut pas personnaliser les commandes pour ne calculer et n'afficher que les informations que l'on souhaite
Bref, j'ai atteint un peu les limites de ce système et je cherche un moyen d'obtenir ces informations autrement. Avez-vous une idée ?
Exemple de mon script de profilage de la consommation disque dur :
#!/bin/bash
function usage
{
cat << EOF
usage: `basename $0` [-d <delay>] [-p <proc_name>] [-f <path>]
This script profile the amount of free memory on hard driver, using 'df' command
Optionnaly, the profiling can be started when the execution of a command is detected, and stopped with it.
OPTIONS:
-h Show this help
-d Sampling rate (<delay> should be in seconds)
-p Name of the processus to track
-f Path to the file system to analyze
EOF
}
# arguments par defaut
delay=3
proc=""
path="/"
# lecture des arguments
while getopts ":hd:p:f:" opt ; do
case $opt in
h)
usage
exit 0;;
d)
delay=$OPTARG;;
p)
proc=$OPTARG;;
f)
path=$OPTARG;;
\?)
echo "Invalid option: -$OPTARG" >&2
usage
exit 1;;
*)
echo -$OPTARG;;
esac
done
echo "iteration nbr;datation;timestamp (ns);used (b);available (b);use (%);mount point"
# s'il n'y a pas de processus a detecter, on commence directement
started=0
stopped=0
if [ -z "$proc" ] ; then
started=1
fi
regex="(.*)\s+([0-9]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9]+%)\s+(.*)"
iteration=0
while [ $stopped -eq 0 ] ; do
# detection du processus
if [ -n "$proc" ] ; then
pid=`ps -A | grep $proc | awk '{print $1}'`
# detection du debut
if [ $started -eq 0 ] ; then
if [ -n "$pid" ] ; then
started=1
START_DATE=$(date +%s%N)
fi
# detection de la fin
else
if [ -z "$pid" ] ; then
stopped=1
fi
fi
fi
# execution de la commande 'df'
if [ $started -eq 1 ] ; then
text=$(df -k $path | tail -n 1)
[[ "$text" =~ $regex ]]
if [[ $? -eq 0 ]] ; then
disk_used=${BASH_REMATCH[3]}
disk_free=${BASH_REMATCH[4]}
disk_perc=${BASH_REMATCH[5]}
disk_mount=${BASH_REMATCH[6]}
datation=$(date +"%Y/%m/%d %H:%M:%S.%N")
duration=$(($(date +%s%N) - $START_DATE))
echo "$iteration;$datation;$duration;$disk_used;$disk_free;$disk_perc;$disk_mount"
fi
((iteration++))
fi
sleep $delay
done
# solution ? aller lire directement les infos dans les fichiers qui vont bien
Posté par NeoX . Évalué à 5.
il me semble que
top
oudf
ne font que "lire" dans des infos dans des fichiers particuliers/proc/meminfo pour l'occupation memoire
/proc/diskstats pour certaines infos sur les disques
y a surement d'autres infos dispo ailleurs, mais je n'ai pas cherché.
[^] # Re: solution ? aller lire directement les infos dans les fichiers qui vont bien
Posté par Kfadelk . Évalué à 1.
Je risque de galérer un peu pour retrouver les stats équivalentes à celles de "top" mais c'est une bonne solution, merci !
# POSIX
Posté par fearan . Évalué à 6.
Le df POSIX n'a pas ce problème (une grande partie des commande posix ont été conçue dans l'optique d'être scriptable, donc d'avoir une sortie harmonisée )
Heureusement df permet d'utiliser la sortie POSIX avec le paramètre -P
pour top je dirai que quelqu'un a déjà répondu au dessus ;)
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
[^] # Re: POSIX
Posté par Kfadelk . Évalué à 1.
Je ne connaissais pas l'option -P, effectivement c'est pratique pour le scripting :)
# vmstat
Posté par jjl (site web personnel) . Évalué à 1.
Salut,
Pas mal des infos "systeme" de top sont dispo avec vmstat dont la sortie est beaucoup plus facile à parser.
Pour des infos sur un process en particulier, j'utilise pas mal ps qui avec ses options permet de sortir plein d'infos très intéressantes. Par exemple pour sortir juste le pid et conso cpu de snmpd :
# snmp
Posté par jolitorax . Évalué à 2.
C'est fait pour, paquet net-snmp pour les redhat-like ou snmpd pour les debian-like
Par exemple
pour le CPU (user)
snmpget -v 1 -c ma_communaute 192.168.1.1 ssCpuRawUser.0
UCD-SNMP-MIB::ssCpuRawUser.0 = Counter32: 204447
Pour le disque
snmpget -v 1 -c ma_communaute 192.168.1.1 hrStorageUsed.1
HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 5943248
Il faut aller voir dans les MIB pour voir précisément ce que tu veux interroger.
Pour visualiser tout ça; MRTG ou Centreon (qui est un peu overkill tout de même pour ce genre d'usage), sinon dans le même veine, mais que je ne connais pas cacti, ganglia
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.