Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/07/2007, 13h41   #1
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
Par défaut Erreur dans script mémoire - problème de calcul

Bonjour,

Voici un script que j'ai réalisé pour avoir des informations sur la mémoire d'une machine UNIX :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function memoire()
{
    TOTAL=`echo $(grep MemTotal: /proc/meminfo) | awk '{print $2}'`
    LIBRE=`echo $(grep MemFree: /proc/meminfo) | awk '{print $2}'`
    CACHE=`echo $(grep Cached: /proc/meminfo) | awk '{print $2}'`
    SWAPTOTAL=`echo $(grep SwapTotal: /proc/meminfo) | awk '{print $2}'`
    SWAPLIBRE=`echo $(grep SwapFree: /proc/meminfo) | awk '{print $2}'`
 
    TOTAL=$[TOTAL / 1000]
    LIBRE=$[LIBRE / 1000]
    CACHE=$[CACHE / 1000]
    SWAPTOTAL=$[SWAPTOTAL / 1000]
    SWAPLIBRE=$[SWAPLIBRE / 1000]
 
    UTILISE=$[TOTAL - LIBRE]
    RELLE_UTILISE=$[UTILISE - CACHE]
    RELLE_LIBRE=$[TOTAL - UTILISE]
    SWAP_UTILISE=$[SWAPTOTAL - SWAPLIBRE]
 
    echo "Mémoire totale             : $TOTAL Mo"
    echo "Mémoire libre              : $LIBRE Mo"
    echo "Mémoire utilisé            : $UTILISE Mo"
    echo "Mémoire cache              : $CACHE Mo"
    echo
    echo "Mémoire rééllement utilisé : $RELLE_UTILISE Mo"
    echo "Mémoire rééllement libre   : $RELLE_LIBRE Mo"
    echo
    echo "Swap totale                : $SWAPTOTAL Mo"
    echo "Swap libre                 : $SWAPLIBRE Mo"
    echo "Swap utilisé               : $SWAP_UTILISE Mo"
}
 
memoire
Le soucie, c'est que ce script plante au niveau des calculs alors que quand j'écris ces lignes de commande dans le Shell, aucun problème, tout fonctionne correctement. De plus j'ai fais un script similaire pour la charge CPU, avec le même genre de calcul, et lui fonctionne à merveille !

Savez vous se qui cloche dans mon script ?
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2007, 14h30   #2
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
J'ai même essayer ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
    TOTAL=`cat /proc/meminfo | grep MemTotal: | awk '{print $2}'`
    LIBRE=`cat /proc/meminfo | grep MemFree: | awk '{print $2}'`
    CACHE=`cat /proc/meminfo | grep Cached: | awk '{print $2}'`
    SWAPTOTAL=`cat /proc/meminfo | grep SwapTotal: | awk '{print $2}'`
    SWAPLIBRE=`cat /proc/meminfo | grep SwapFree: | awk '{print $2}'`
 
    TOTAL=$[TOTAL / 1000]
    LIBRE=$[LIBRE / 1000]
    CACHE=$[CACHE / 1000]
    SWAPTOTAL=$[SWAPTOTAL / 1000]
    SWAPLIBRE=$[SWAPLIBRE / 1000]
 
    UTILISE=$[TOTAL - LIBRE]
    RELLE_UTILISE=$[UTILISE - CACHE]
    RELLE_LIBRE=$[TOTAL - UTILISE]
    SWAP_UTILISE=$[SWAPTOTAL - SWAPLIBRE]
 
    UTILISE_POURCENTAGE=$[UTILISE * 100 / TOTAL]
    SWAP_POURCENTAGE=$[SWAP_UTILISE * 100 / SWAPTOTAL]
 
    echo "Mémoire totale             : $TOTAL Mo"
    echo "Mémoire libre              : $LIBRE Mo"
    echo "Mémoire utilisé            : $UTILISE Mo soit $UTILISE_POURCENTAGE%"
    echo "Mémoire cache              : $CACHE Mo"
    echo
    echo "Mémoire rééllement utilisé : $RELLE_UTILISE Mo"
    echo "Mémoire rééllement libre   : $RELLE_LIBRE Mo"
    echo
    echo "Swap totale                : $SWAPTOTAL Mo"
    echo "Swap libre                 : $SWAPLIBRE Mo"
    echo "Swap utilisé               : $SWAP_UTILISE Mo soit $SWAP_POURCENTAGE%"
En faite, ca débloque quand je récupère les informations TOTAL et LIBRE, je pense qu'il doit y avoir un problème dans la chaine que je récupère ! pourtant j'ai regardé s'il n'y avait pas de blanc en fesans un sed, mais rien à faire le problème est tjr la !
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2007, 10h54   #3
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Que veux tu dire par "débloque". Message d'erreur ou problème d'arrrondi?

S'il s'agit du dernier cas, c'est normal, la précision des calculs en bash est limitée. Pour plus de précision, regarde du côté de bc.

Par ailleurs, tu peux éviter une partie des calculs en parsant la sortie d'une commande du genre:

Edit:

Essaye aussi de changer tes motifs du grep en ancrant le début de chaîne:
Code :
1
2
3
4
5
   TOTAL=`cat /proc/meminfo | grep ^MemTotal: | awk '{print $2}'`
    LIBRE=`cat /proc/meminfo | grep ^MemFree: | awk '{print $2}'`
    CACHE=`cat /proc/meminfo | grep ^Cached: | awk '{print $2}'`
    SWAPTOTAL=`cat /proc/meminfo | grep ^SwapTotal: | awk '{print $2}'`
    SWAPLIBRE=`cat /proc/meminfo | grep ^SwapFree: | awk '{print $2}'`
Et, tant qu'à faire, change tes affectations de variables par quelque-chose de plus direct. Tu fais un cat -> grep -> awk alors qu'un seul awk pourrait suffire:
Code :
1
2
3
4
5
    TOTAL=$(awk '/^MemTotal/ {print $2}' /proc/meminfo)
    LIBRE=$(awk '/^MemFree/ {print $2}' /proc/meminfo)
    CACHE=$(awk '/^Cached/ {print $2}' /proc/meminfo)
    SWAPTOTAL=$(awk '/^SwapTotal/ {print $2}' /proc/meminfo)
    SWAPLIBRE=$(awk '/^SwapFree/ {print $2}' /proc/meminfo)
A peu près 30% plus rapide.
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2007, 00h50   #4
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
ok merci,

je vais tester cela demain car la il est tard !

Sinon je ne veux pas utiliser FREE car je veux un script portable au maximun...

je vous tien au courant.
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2007, 09h25   #5
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
J'ai optimisé mon code après tes conseils.

Sinon l'erreur que j'ai est :

Code :
")syntax error: operand expected (error token is "
Quand j'execute mon script, ligne par ligne dans le shell, en écrivant chaques commandes à la main, j'ai aucun problème... c'est juste quand je veux executer ce code en bash que j'ai un message d'erreur.
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2007, 11h51   #6
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
Help ! Personne pour m'aider ?

Après pleins de test, je n'arrive tourjours pas à trouver mon erreur... il y a peut être d'autres solutions pour faire des calculs ?

P.S : j'ai essayé avec bc, et j'ai aussi une erreur, il me dit qu'il y a un caractère invalide ^M...
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2007, 12h01   #7
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
C'est bon mon erreur est résolut !

En faite dans mon code il n'y a aucune erreur !

Je pense que c'est le faite d'avoir edité ma source avec windows puis avec avec unix...
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h36.


 
 
 
 
Partenaires

Hébergement Web