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 :

Afficher des informations du système via une barre de status


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut Afficher des informations du système via une barre de status
    Bonjour

    Je viens de terminer un script qui permet d'afficher des informations système via une barre de statut (dzen2).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    #!/bin/sh
     
    ############
    # separator
    ############
     
    sep=`echo -e "|"`
     
    ############
    # functions
    ############
     
    gcpu () {
        cpu_r=""
        cpu_s=`sysctl -n hw.sensors.cpu0.temp0 | awk '{ print $1 }' | cut -c 1-2`
        cpu_t=105 # max temperature (intel core i5 mobile processor)
        if [ "$cpu_s" -ge 90 ]; then
            cpu_r="CPU: ${cpu_s}°C"
        else
            cpu_r="CPU: ${cpu_s}°C"
        fi
        echo -e $cpu_r
    }
     
    gmem () {
        mem_r=`vmstat | tail -1 | awk '{ print $3"/"$4 }'`
        echo -e "Mem: ${mem_r}"
    }
     
    gpf () {
        pf_r=""
        pf_s=`doas pfctl -si | grep -E ^Status | cut -c 9-15`
        if [ "$pf_s" == "Enabled" ]; then
            pf_r="PF: On"
        else
            pf_r="PF: Off"
        fi
        echo -e $pf_r
    }
     
    gnet () {
        net_r=""
        trunk_s=`ifconfig | grep -A8 "^trunk0" | awk '$1 ~ /status/ { print $2 }'`
        em_s=`ifconfig | grep -A8 "^em0" | awk '$1 ~ /status/ { print $2 }'`
        iwn_s=`ifconfig | grep -A8 "^iwn0" | awk '$1 ~ /status/ { print $2 }'`
        if [[ "$trunk_s" == "active" && "$em_s" == "active" ]]; then
            net_r="net: On - Eth"
        elif [[ "$trunk_s" == "active" && "$iwn_s" == "active" ]]; then
            net_r="Net: On - Wifi"
        else
            net_r="Net: Off"
        fi
        echo -e $net_r
    }
     
    gbacklight () {
        backlight_p=`xbacklight | awk '{printf("%d\n",$1 + 0.5)}'`
        echo -e "Backlight: ${backlight_p}"
    }
     
    gbatt() {
        batt_r=""
        batt_s=`apm -a` # 0 (disconnected) 1 (connected)
        ac_s=`apm -b`   # 1 (high) 2 (low) 3 (critical)
        batt_p=`apm -l`
        batt_t=`apm -m`
        tleft_h=`echo "($batt_t)/60" | bc`
        tleft_m=`echo "($batt_t)-$tleft_h*60" | bc`
        if [[ "$ac_s" -eq 1 && "$batt_s" -eq 0 && "$batt_t" -eq 0 ]]; then
            batt_r="Batt: ${batt_p} - Time left: Calculating..."
        elif [[ "$ac_s" -eq 2 && "$batt_s" -eq 0 && "$batt_t" -eq 0 ]]; then
            batt_r="Batt: ${batt_p}% - Time left: Calculating..."
        elif [[ "$ac_s" -eq 1 && "$batt_s" -eq 0 ]]; then
            batt_r="Batt: ${batt_p}% - Time left: ${tleft_h}h:${tleft_m}m"
        elif [[ "$ac_s" -eq 1 && "$batt_s" -eq 1 ]]; then
            batt_r="Batt: ${batt_p}%"
        elif [[ "$ac_s" -eq 2 && "$batt_s" -eq 0 ]]; then
            batt_r="Batt: ${batt_p}% - Time left: ${tleft_h}h:${tleft_m}m"
        elif [[ "$ac_s" -eq 2 && "$batt_s" -eq 1 ]]; then
            batt_r="Batt: ${batt_p}%"
        else
            batt_r="Batt: ${batt_p}%"
        fi
        echo -e $batt_r
    }
     
    gvol() {
        vol_r=""
        vol_p=$((`mixerctl -n outputs.master | cut -f 1 -d ','`*100/255))
        vol_m=`mixerctl -n outputs.master.mute`
        if [[ "$vol_p" -eq 0 || "$vol_m" == "off" ]]; then
            vol_r="Vol: Off"
        else
            vol_r="Vol: ${vol_p}%"
        fi
        echo -e $vol_r
    }
     
    gdate() {
        date_f="%d %b %H:%M"
        echo -e "`date +"%a, ${date_f}"`"
    }
     
    ########
    # dzen2
    ########
     
    width=800
    height=12
     
    resol=`xrandr -q | grep -w Screen | awk '{ print $8 }'`
     
    xwidth=`echo "($resol)-($width)" | bc`
    yheight=1
     
    font="terminus:size=8"
    align="r" # l (left) c (center) r (right)
     
    bgcolor="#000000"
    fgcolor="#8f8f8f"
     
    params="-x $xwidth -y $yheight -h $height -fn $font -bg $bgcolor -fg $fgcolor -ta $align"
    actions="button3=entertitle=unhide"
     
    #########
    # output
    #########
     
    while true; do
        echo "$(gcpu) $sep $(gmem) $sep $(gnet) $sep $(gpf) $sep $(gbacklight) $sep $(gbatt) $sep $(gvol) $sep $(gdate)"
        sleep 1
    done | dzen2 $params -e $actions &
    Le script fonctionne mais je souhaite savoir si certaines parties peuvent être optimisées.
    J'ai retiré volontairement les couleurs sinon c'est le foutoir.

    Merci d'avance pour vos commentaires

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    comme chaque "sonde" va être appelée chaque seconde, l'optimisation va consister à faire le moins d'appels à des commandes externes possible, moins de context-switch, et une exécution potentiellement plus rapide (bash étant très lent)

    par exemple gcpu() on doit pouvoir la dérouler ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    gcpu() {
       sysctl -n hw.sensors.cpu0.temp0 | awk '
       BEGIN {
          NORMAL = "\033[0m"
          VERT   = "\033[1;32m"
          ROUGE  = "\033[1;31m"
       } {
          t = int($1)
          if (t >= 90) {
             color = ROUGE
          } else {
             color = VERT
          }
       } END {
          printf("%sCPU: %d°C%s\n", color, t, NORMAL)
       }'
    }
    1 sysctl, 1 awk, et c'est tout.

    j'ai pas forcément compris toutes les autres fonctions, gmem() par exemple je me demande ce que tu récupères, la commande free pourrait peut-être simplifier/fiabiliser les choses ?
    l'exemple le plus frappant c'est probablement gnet() qui fait 3 fois la même opération pour des interfaces différentes, alors qu'avec un output unique on doit pouvoir récupérer d'un seul coup les trois valeurs qui nous intéresse

    dans un monde idéal on aurait un daemon unique qui tourne en permanence (1 seul processus, en Perl ou Python par exemple) et se charge de relever toutes les valeurs, de les présenter bien organisées sur une socket ou autre en mode bloquant, et quand une application vient débloquer en lisant les infos le daemon retourne faire son relevé

  3. #3
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    l'exemple le plus frappant c'est probablement gnet() qui fait 3 fois la même opération pour des interfaces différentes, alors qu'avec un output unique on doit pouvoir récupérer d'un seul coup les trois valeurs qui nous intéresse
    J'ai testé avec le commande suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ifconfig | sed -n '/em0/,/iwn0/p' | awk '$1 ~ /status/ { print $2 }'
    j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    no carrier (pour em0)
    active (pour iwn0)
    Maintenant, je dois tester la ligne 1 et 2.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    il n'est pas optimale de piper sed vers awk, sachant que awk sait faire ce que fait sed.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    J'ai adopté une autre approche étant que j'utilise trunk0 (interface d'agrégation) qui à l'avantage de m'indiquer le statut de l'interface em0 (ethernet) et iwn0 (wifi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ifconfig | grep trunkport
    trunkport iwn0 active
    trunkport em0 master
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ifconfig | grep trunkport
    trunkport iwn0
    trunkport em0 master,active
    ce qui donne au niveau du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    gnet() {
        net_r=""
        net_s=`ifconfig | grep trunkport | awk '/active/ { print $2, $3 }'`
        if [[ $net_s == "iwn0 active" ]]; then
            net_r="Net: On - Wifi"
        elif [[ $net_s == "em0 master,active" ]] ; then
            net_r="Net: On - Eth"
        else
            net_r="Net: Off"
        fi
    }
    D'autres idées ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    même remarque pour grep | awk que pour sed | awk.

    et puis, il semble y avoir un souci : si la variable est sur plusieurs ligne aucun test ne fonctionnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ var="a
    > b
    > c"
    $ [[ $var == b ]]; echo $?
    1
    $ [[ $var == a ]]; echo $?
    1
    $ [[ $var == $'a\nb\nc' ]]; echo $?
    0
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 292
    Par défaut
    Bonjour

    J'enfourche un dada :
    while true me file des boutons.
    Tu dois penser à la condition d'arrêt. Un programme qui fonctionne à vie, ça n'existe pas.

    À ta place, et sans idée sur la raison d'arrêt, je remplacerais par while [ ! -e /tmp/arret ] et, ainsi, un simple echo fin >/tmp/arret, ou même >/tmp/arret, est suffisant pour arrêter le processus.

    Shell1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ while [ ! -e /tmp/arret ];do echo "En attendant, moi, j'attends ! (pef)";sleep 10;done
    En attendant, moi, j'attends ! (pef)
    En attendant, moi, j'attends ! (pef)
    En attendant, moi, j'attends ! (pef)
    $
    Shell2:

  8. #8
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Merci pour toutes ces informations. J'ai vais revoir tout ça

  9. #9
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    J'enfourche un dada :
    while true me file des boutons.
    Tu dois penser à la condition d'arrêt. Un programme qui fonctionne à vie, ça n'existe pas.

    À ta place, et sans idée sur la raison d'arrêt, je remplacerais par while [ ! -e /tmp/arret ] et, ainsi, un simple echo fin >/tmp/arret, ou même >/tmp/arret, est suffisant pour arrêter le processus.

    Shell1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ while [ ! -e /tmp/arret ];do echo "En attendant, moi, j'attends ! (pef)";sleep 10;done
    En attendant, moi, j'attends ! (pef)
    En attendant, moi, j'attends ! (pef)
    En attendant, moi, j'attends ! (pef)
    $
    Shell2:
    A titre d'informations j'utiliser dwm (dynamic window manager) de suckless qui intègre une barre de status que j'alimente avec xsetroot.

    Lorsque je quitte dwm, la barre de status n'est plus.

    J'ai du mal à comprendre ce que tu essayes de me dire.

    D'après le code que tu as indiqué, il faudrait que j'utilise un fichier FIFO c'est bien cela ?

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par Olivier Regnier Voir le message
    J'ai du mal à comprendre ce que tu essayes de me dire.
    Pourtant il suffit de lire,

    Citation Envoyé par Olivier Regnier Voir le message
    D'après le code que tu as indiqué, il faudrait que j'utilise un fichier FIFO c'est bien cela ?
    Nan !
    Il faudrait que tu utilises un simple fichier tout bête : c'est sa présence ou son absence qui va déterminer le comportement du while.

  11. #11
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Sans passer par un fichier, serait-il possible de faire ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    done=0
    while true; do
        xsetroot -name "${gpf} $sp ${gbatt} $sp ...."
        sleep 10
        if [ $done -ne 0 ]; then
            break
        fi
    done &

  12. #12
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 292
    Par défaut
    Sans passer par un fichier, serait-il possible de faire ceci ?
    - Je voudrais un café avec des croissants.
    - Nous n'avons pas de croissants, Monsieur.
    - Ah ! Très bien. Alors donnez-moi un thé avec des croissants.




    Le but était de tordre le cou à cette immonde boucle infinie.
    Et tu reviens avec la même.

    Si tu ne veux pas écrire le fichier, ne l'écris pas. (la boucle sera la même).
    Jusqu'au jour où ...
    ... tu seras bien content de pouvoir reprendre la main sur ton programme devenu fou.

Discussions similaires

  1. Afficher des informations en fonction d'une zone précédement saisie
    Par ybezier dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 23/12/2010, 10h01
  2. [AC-2003] Afficher des information dans une infobulle
    Par Rikou31 dans le forum VBA Access
    Réponses: 0
    Dernier message: 07/05/2009, 14h31
  3. Afficher des informations dans une bulle au survol d'une partie d'une carte
    Par JackBeauregard dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 10/06/2008, 08h43
  4. Afficher des informations dans une liste déroulante
    Par onlytime dans le forum Langage
    Réponses: 1
    Dernier message: 08/03/2008, 18h47
  5. Afficher des informations dans une ListView
    Par revero275 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/04/2007, 21h58

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