IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Calcul dans un script bash


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Points : 79
    Points
    79
    Par défaut Calcul dans un script bash
    Bonjour,

    Je "m'amuse" à modifier le MOTD qui s'affiche sur ma VM distante lors d'une connexion ssh.

    Je souhaite faire apparaitre la charge CPU actuelle.

    Sur le net, j'ai trouvé une commande qui me permet de récupérer idle time
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    top -bn1 | grep '%Cpu(s)' | awk -F',' '{printf "CPU id %: %.2f%\n", $4}'
    Mais il me faut faire 100% - idle time pour obtenir la charge du CPU et je suis pas très à l'aise avec awk ...

    Vous feriez comment ?

    Merci

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    je n'utiliserais pas grep, parce que awk sait faire ce que fait grep.

    mais, je ne comprends pas ta démarche.
    que donne la commande : LC_NUMERIC=C top -bn1 | awk '/CPUS\(s\)/' ?
    quelle information souhaites-tu extraire ?
    quelle transformation doit-elle encore y être appliquée ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Points : 79
    Points
    79
    Par défaut
    Bonjour,
    Je vais essayer de détailler plus clairement 😉

    • Je souhaite faire apparaitre quelque chose du genre

    CPU Usage : 11%

    Mais je n'ai pas trouvé une commande sous linux qui me donne ça directement, après quelques recherches sur le net, j'ai trouvé cette information :


    Suite à ça, j'ai donc regardé comment obtenir la valeur id (= idle time) et j'ai trouvé cette solution :
    top -bn1 | grep '%Cpu(s)' | awk -F',' '{printf "%.2f%\n", $4}'.

    Si je reprend mon histoire de "CPU Usage", cette commande me retournerait 89%.
    Et donc je recherche comment faire la soustraction 100-89 dans la commande pour que le retour soit 11%.

    LC_NUMERIC=C top -bn1 | awk '/CPUS\(s\)/' me retourne rien du tout 🤔

    J'espère que c'est plus clair comme ça ? 😖 en tout cas merci de m'avoir répondu 😉

    PS: je ne suis pas fermé a une autre méthode plus adaptée ou mieux écrite, si le combo grep / awk n'est pas judicieux.

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Au point où tu en es, tu peux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LC_NUMERIC=C top -bn1 | awk '$9=="id,"{print 100-$8}'
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    LC_NUMERIC=C top -bn1 | awk '/CPUS\(s\)/' me retourne rien du tout
    c'est normal, c'était pour voir si tu suivais.

    sérieusement, je me suis trompé en réécrivant la commande (j'aurais dû faire un copier/coller (on préfère d'ailleurs les copier/coller plutôt que les captures d'écrans))
    la bonne commande, dont je voudrais voir le résultat, est LC_NUMERIC=C top -bn1 | awk '/%Cpu\(s\)/'le séparateur de champ sera bien la virgule
    c'est le quatrième champ qui contient la valeur pertinente
    il faudra substituer les espaces et le libellé par rien
    tu pourra ensuite effectuer les opérations que tu souhaites.

    on va avancer ensemble.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Points : 79
    Points
    79
    Par défaut
    Bonjour,
    Citation Envoyé par Flodelarab Voir le message
    Bonjour
    Au point où tu en es, tu peux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LC_NUMERIC=C top -bn1 | awk '$9=="id,"{print 100-$8}'
    ça semble me donner le resultat mais des fois ça fonctionne pas il retourne rien , c'est normal ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    gegax@51.178.55.190:~ $ LC_NUMERIC=C top -bn1 | awk '$9=="id,"{print 100-$8}'
    user@server:~ $ LC_NUMERIC=C top -bn1 | awk '$9=="id,"{print 100-$8}'
    6.2
    user@server:~ $ LC_NUMERIC=C top -bn1 | awk '$9=="id,"{print 100-$8}'
    11.8
    user@server:~ $ LC_NUMERIC=C top -bn1 | awk '$9=="id,"{print 100-$8}'
    user@server:~ $ LC_NUMERIC=C top -bn1 | awk '$9=="id,"{print 100-$8}'
    18.8
    user@server:~ $ LC_NUMERIC=C top -bn1 | awk '$9=="id,"{print 100-$8}'
    user@server:~ $ LC_NUMERIC=C top -bn1 | awk '$9=="id,"{print 100-$8}'
    user@server:~ $ LC_NUMERIC=C top -bn1 | awk '$9=="id,"{print 100-$8}'
    11.8

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    c'est normal, c'était pour voir si tu suivais.
    la bonne commande, dont je voudrais voir le résultat, est LC_NUMERIC=C top -bn1 | awk '/%Cpu\(s\)/'
    Yep la ça fonctionne, j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %Cpu(s):  0.0 us, 11.1 sy,  0.0 ni, 83.3 id,  0.0 wa,  0.0 hi,  0.0 si,  5.6 st

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    S'il ne retourne rien, c'est que "awk" n'a pas reconnu ce qu'il devait reconnaître. Pour débusquer le problème, tente cette commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LC_NUMERIC=C top -bn1 | awk '{mem=mem"\n"$0;} $9=="id,"{print 100-$8; vu=1;} END{if (vu==0) {print "FAUTE ! Voilà le résultat reçu pour traitement :";print mem;}}'
    Si elle marche bien, elle renvoie la valeur. Sinon, elle renvoie le texte complet qu'elle n'a pas su traiter. Tu verras ce qui cloche.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    S'il ne retourne rien, c'est que "awk" n'a pas reconnu ce qu'il devait reconnaître. Pour débusquer le problème, tente cette commande :
    Si elle marche bien, elle renvoie la valeur. Sinon, elle renvoie le texte complet qu'elle n'a pas su traiter. Tu verras ce qui cloche.
    Merci (ça a l'air puissant awk va falloir que je m'y intéresse ...

    Lorsque ça fonctionne pas, ça m'imprime la totalité de la commande top mais a chaque fois on y voit que id est a 100, donc je suppose que la soustraction 100-100 au lieu de retourner 0 fait tout partir en sucette ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    LC_NUMERIC=C top -bn1 | awk '{mem=mem"\n"$0;} $9=="id,"{print 100-$8; vu=1;} END{if (vu==0) {print "FAUTE ! Voilà le résultat reçu pour traitement :";print mem;}}'
    FAUTE ! Voilà le résultat reçu pour traitement :
     
    top - 17:41:20 up 56 days,  7:34,  1 user,  load average: 0.00, 0.00, 0.01
    Tasks:  82 total,   1 running,  81 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    MiB Mem :   1949.7 total,   1071.9 free,    218.2 used,    659.6 buff/cache
    MiB Swap:   2048.0 total,   1972.5 free,     75.5 used.   1537.9 avail Mem

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Wow. Tu arrives à avoir 100% d'inactivité. Du coup, 100.0 prend tout l'espace (masculin) et l'espace (féminin) disparaît.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LC_NUMERIC=C top -bn1 | awk -F'[ ,]' '/^%Cpu/{for (i=1;i<=NF;i++) if ($i=="id") print 100-$(i-1);}'
    Concrètement, 2 différences avec les précédentes :
    • On ne garde que la ligne qui commence par %Cpu
    • On ajoute la virgule comme séparateur à l'espace, pour scanner tous les champs et trouver celui qui nous intéresse.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 320
    Points : 79
    Points
    79
    Par défaut
    Ça fonctionne dans tous les cas de figures 😊
    Je comprends pas grand chose à la commande ...
    LC_NUMERIC=C top -bn1 jusque là ok je ne connaissais pas mais je capte en revanche la suite ça relève du flou artistique 🤣
    Va falloir que je me creuse les méninges ..., mais ça fait le job !
    Merci beaucoup pour votre aide

    PS j'exagère je capte un peu plus que ce que je dis mais je suis incapable de pondre ça 😉
    Merci encore

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Fun...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ python3 -c 'import psutil; print(psutil.cpu_times_percent(interval=1,percpu=False))'
    scputimes(user=4.5, nice=0.0, system=0.1, idle=95.1, iowait=0.0, irq=0.0, softirq=0.2, steal=0.0, guest=0.0, guest_nice=0.0)
    Cordialement.

  13. #13
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    100.0 prend tout l'espace (masculin) et l'espace (féminin) disparaît.
    Waouh, seuls les typographes comprendront,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Son dans un script bash
    Par clodette0071 dans le forum Linux
    Réponses: 2
    Dernier message: 09/07/2008, 12h27
  2. affichage de printf dans un script bash
    Par kass28 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 19/03/2008, 21h36
  3. Requête POST dans un script bash
    Par desperado dans le forum Linux
    Réponses: 4
    Dernier message: 11/12/2007, 22h38
  4. exit dans un script bash
    Par yann_m dans le forum Linux
    Réponses: 2
    Dernier message: 08/11/2007, 23h37
  5. [Débutant]Intégrer du perl dans un script bash
    Par kromartien dans le forum Langage
    Réponses: 3
    Dernier message: 05/03/2007, 23h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo