Forum Programmation.shell Calcul occupation disque dur d'un exécutable

Posté par . Licence CC by-sa.
0
8
avr.
2013

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 . Évalué à 5.

    il me semble que top ou df 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é.

  • # POSIX

    Posté par . É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 . Évalué à 1.

      Je ne connaissais pas l'option -P, effectivement c'est pratique pour le scripting :)

  • # vmstat

    Posté par (page perso) . É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 :

    ps -C snmpd -o pcpu,pid
    
    
  • # snmp

    Posté par . É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 à ceux qui les ont postés. Nous n'en sommes pas responsables.