URL: https://linuxfr.org/forums/programmation-shell/posts/calcul-occupation-disque-dur-d-un-executable Title: Calcul occupation disque dur d'un exécutable Authors: Kfadelk Date: 2013年04月08日T10:15:01+02:00 License: CC By-SA Tags: shell, bash et profilage Score: 0 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 : ```bash #!/bin/bash function usage { cat << EOF usage: `basename 0ドル` [-d ] [-p ] [-f ] 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 ( 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 ```

AltStyle によって変換されたページ (->オリジナル) /