Comment afficher les processus dynamiquement avec une entête statique

BillyV33 -  
billyV33 Messages postés 24 Statut Membre -
Bonjour,
je dois écrire un script qui me permet d'avoir un affichage dynamique des processus en cours en boucle infinie et avec un affranchissement de 2 secondes
De plus , il faudrait afficher par dessus les lignes déjà écrites...je pense que je dois garder l'entête statique ...
on me demande de lire le manuel console_codes et de caractères spéciaux CSI sequence mais je ne comprend rien...!

pour l'instant à part afficher avec des entêtes demandées des ps en cours....
je bloque complètement!
J'ai beau lire le manuel ... je ne sais même pas par où commencer ni quoi parmi tout cela pourrait bien me servir !

ps -o suser,pid,%cpu,%mem,cputime,comm | head


Merci de me sortir de cet impasse et énorme trou noir!!

Configuration: Linux / Firefox 60.0

7 réponses

  1. lEprofSonDkon Messages postés 227 Statut Membre 13
     
    ok...
    top -d 2

    !
    0
  2. BillyV33
     
    bonjour

    effectivement je l'avais remarqué top avait ce comportement...
    mais là on me demande, pour monTP!, et il me manque deux questions et c'est pour demain!!!
    en tout cas!
    voilà ce qu'on me demande :
    ## Fonctionnement
    minitop contient une "boucle infinie" qui lui permet de rester en cours d'execution. Toutes les 1 seconde l'appel à `ps` est renouvelé et (c'est là que je bogue!) l'affichage des nouvelles lignes se fait par dessus les anciennes lignes. Visuellement cela reste presque statique, comme l'appel au programme "top".

    On peut quitter le programme en utilisant simplement Ctrl-C.

    L'appel à `ps` doit être fait de la manière suivante :
    - afficher tous les processus du système
    - afficher les colonnes suivantes :
    le nom d'utilisateur, le pid, l'utilisation du cpu, le pourcentage de la mémoire physique que le process occupe, le temps CPU cumulé, et le nom de la commande.

    Les options à afficher sont les mêmes en cas d'option sans la boucle infinie.

    (et ici on me perd complètement!)
    Pour afficher par dessus des lignes déjà écrites, vous allez avoir besoin de la page de manuel "console_codes" et de caractères spéciaux. Cherchez le paragraphe qui contient "CSI sequence".


    ## Exemples
    Pour mieux comprendre comment utiliser ces caractères spéciaux, testez ça :
    ```sh
    echo -e "coucou___ \033[4Di"
    echo -e "coucou___ \033[1Di"
    echo -e "coucou___ \033[10DQ"
    echo -e "coucou___ \033[13Cplus loin: bonjour"


    MERCIIII!!! lEprofSonDkon d'être encore là ! :):)
    0
    1. lEprofSonDkon Messages postés 227 Statut Membre 13
       
      d'abord, il faut faire un "clear" de la console, c'est-à-dire déplacer le curseur tout en haut du terminal (HOME) et effacer l'écran
      ensuite, tu affiches l'en-tête
      puis, à chaque tour de boucle, il faut positionner le curseur à la ligne 2 colonne 0

      dans la page man, ESC correspond au code
      \033[
      donné dans les exemples.

      les passage en italique sont des fonctionnalités ANSI/CSI
      il n'y a pas de secret, il faut "jouer" avec les séquences pour voir comment elles fonctionnent.

      AH! MES YEUX !
      LES BALISES CODES !!!
      0
  3. BillyV33
     
    Vraiment désolée pour le balises ! décidément je suis bouchée!!
    je pensais avoir bien mis ma petite ligne de code bien en évidence!

    ps -o suser,pid,%cpu,%mem,cputime,comm | head 
    

    Peux-tu me faire un exemple STP parce que je ne saisi pas où je me trompe et ça m’énerve de devoir t’arracher les yeux à chaque fois!!!

    Encore merci pour tes explications!:):)
    je vais regarder ça et je reviens..
    :):)
    0
    1. lEprofSonDkon Messages postés 227 Statut Membre 13
       
      un exemple ? de mise entre balises CODE ?
      < code sh >#!/bin/bash

      echo "des balises code" < /code >
      pour que ça fonctionne, supprime l'espace après < , et avant >
      :)

      un exemple de ANSI Escape Code ?
      #!/bin/bash
      
      echo
      for ((n=12;n>=0;n--))
      do
          echo -e "\033[1F\033[0K$n"
          sleep 1
      done
      0
    2. BillyV33
       
      bonsoir lEprofSonDkon !:)
      j'ai trouvé ça pour l'instant mais je ne sais pas si je suis dans la bonne voie!

      je vais analyser ta ligne echo pour bien la comprendre! c'est un peu comme quand on veut changer notre prompt


      #!/bin/sh
      
      #1- effacer l'écran
      #2- afficher l'en-tête
      #3- à chaque tour de boucle, il faut positionner le curseur à la ligne 2 colonne 0
      #    tput cup X Y si je ne veux pas qu'il soit trop détaché je pourrais mettre 1 0 
      
      if  [ "$num_lignes" -ge 1 -a "$num_lignes" -le 25 2>/dev/null ]; then
          clear
          ps -o user,pid,%cpu,%mem,cputime,comm | head -n 1
      
          while [ 1 ]; do
               tput cup 2 0
               ps -o user=,pid=,%cpu=,%mem=,cputime=,comm= | head -n "$num_lignes" 
               sleep 1
        done        
       exit 0
      fi


      WOW je ne pensais pas pouvoir comprendre quelque chose à tout ça mais avec ton aide les idées
      deviennent de plus en plus claires! ! MERCIII!!!!!

      estcequepourlesbalisescestmieux? j'ai peur pour tes yeux!!!
      0
      1. lEprofSonDkon Messages postés 227 Statut Membre 13 > BillyV33
         
        si l'énoncé demande des séquences CSI,
        tput
        ne sera pas accepté.

        il ne faut pas envoyer les erreurs de test vers /dev/null.

        mais, est-ce que ça ne pourrait pas être aussi simple que de nettoyer l'écran à chaque boucle, et en renvoyant le curseur tout en haut ?
        finalement, on s'en fout de l'en-tête, il sera écraser à chaque fois, tant pis pour lui.
        while true
        do
           printf '"CSI sequence" à trouver'
           ps -o user,pid,%cpu,%mem,cputime,comm
           sleep 1
        done

        ou bien faut-il ne pas nettoyer le terminal ?
        alors, il faut connaître le nombre de lignes produit par
        ps
        !
        il n'est pas dit dans l'énoncé que le nombre de lignes doit être restreint, mais il doit l'être par rapport au terminal.
        unset nbL; while true ; do nbL=$(ps x --sort -%cpu -o user,pid,%cpu,%mem,cputime,comm | head -n $LINES | tee -a /dev/tty | wc -l); sleep 1; printf '"CSI sequence" à trouver' $nbL; done;}

        je spoile un peu, mais là, je ne sais pas comment expliquer sans te montrer, donc autant te montrer sans expliquer; cela t'es laissé comme exercice supplémentaire.

        heu, non.
        la balise code "entrante", c'est
        <code sh>
        (sh pour du code shell), et la balise code "fermante", c'est </code>,
        et entre les deux, tu mets le code.

        il y a un bouton, à côté des boutons [B] [ I ] [S], et une flèche pour choisir le langage.
        0
  4. BillyV33
     
    merci beaucoup IEprofSonDkon ! :)
    je vais voir si je vais avoir le temps de me pencher un peu plus sur cette question demain
    j'en ai une autre à faire et toutes les explications des démarches
    mais en passant j'ai trouvé

    \033[H et \033[J


    je pense que ça fait ce que je cherche mais je ne réussi pas à être sûr de ce que je vois...
    je vais me coucher mon cerveau est mort!
    c'est un vrais plaisir ! apprend plein de choses... j'aurais aimé avoir plus de temps mais bon!
    Merci encore pour ton aide ! :):)
    tes yeux vont mieux se reposer!!! :):)
    0
    1. BillyV33
       
      ALLÔ lEprofSonDkon !
      je pense que la nuit porte conseil! je pense avoir trouvé....
      \033[1;0H je vais peut-être rajouter quelque comme le clear... à voir je vais tester
      Merci encore!!! :):) tu m'as vraiment mise sur la bonne voie!

      #!/bin/sh
      
      num_lignes="$1"
          
      if [ "$num_lignes" -ge 1 -a "$num_lignes" -le 25 2>/dev/null ]; then
          
          clear
      
          while [ 1 ]; do
             affiche=$(ps -o user=,pid=,%cpu=,%mem=,cputime=,comm= | head -n "$num_lignes")
             echo "\033[1;0H$affiche"
             sleep 1
          done        
          exit 0
      fi
      0
      1. lEprofSonDkon Messages postés 227 Statut Membre 13 > BillyV33
         
        non, ce n'est pas ça.
        \033[n;mH
        place le curseur à la ligne
        n
        depuis la ligne 1 du terminal, ça ne déplace pas le curseur de
        n
        lignes vers le haut, c'est-à-dire du nombre de lignes affichées.
        Move cursor to beginning of the line, N lines up (default 1)

        désolé, je n'avais pas vu ton message précédent.
        0
    2. BillyV33
       
      #!/bin/sh
      
      echo "je viens de voir le sh dans les choix!...vaut mieux tard que jamais!!!!"</code>
      0
      1. lEprofSonDkon Messages postés 227 Statut Membre 13 > BillyV33
         
        argh, non. toujours pas.
        il manque la balise "ouvrante"
        <code>
        .
        0
    3. BillyV33
       
      Bonjour IEprofSonDkon!
      Désolée pour le silence !!! je n'avais pas d'internet où j'étais!
      Merci pour la réponse! Finalement, j'ai fait le mauvais choix... bon..
      Mais il y a-t-il un moyen pour tester si ça se passe bien? parce que à part de regarder l'écran qui rafraîchi tous les 1 seconde et qui reste à la même place, je ne savais pas si c'était bon ou non ce qui était en train de ce passer
      En tout cas, tout est rendu, donc c'est vraiment juste pour curiosité personnelle!:)
      C'est un sujet que j'aurai bien aimer approfondir un peu plus

      Merci encore et encore pour ton aide précieux!! :):)
      Je vais attendre un peu pour mettre résolu. Si tu as une suggestion pour les tests :)

      Merci et bonne journée! :):)
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Et la commande watch, ça ne ferait pas l'affaire ?

    watch -t -d  "ps x --sort -%cpu -o user,pid,%cpu,%mem,cputime,comm | head -n 5"


    0
    1. lEprofSonDkon
       
      j'ai essayé de ruser, moi aussi, mais il semble que l'exercice porte sur les séquences ANSI/CSI :
      « lire le manuel console_codes et de caractères spéciaux CSI sequence »
      0
    2. BillyV33
       
      Bonjour sipe31,

      Merci beaucoup pour ta suggestion !
      je vais regarder ta ligne pour voir ce qu'elle retourne :)
      0
    3. BillyV33
       
      Bonjour zipe31!
      est-ce que le --sort je peux l'utiliser si je dois utiliser du POSIX?
      juste pour être sûr que le mélange de -x -%cpu --sort et le -o... ne posent pas de problème avec .sh
      si je comprends bien le --sort est GNU mais les normes peuvent cohabiter dans ps
      Merci!
      0
      1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > BillyV33
         
        Je crains que non (man ps (posix)) ;-\
        0
    4. BillyV33
       
      Bonjour sipe31!
      Bon! je pense que mon script pour cette question est complètement raté!
      Mais bon, au moins j'ai appris des choses! :) surtout celles à ne pas faire Haha!
      Je l'avais regardé le man pourtant c'est pour ça que je me posais la question .
      Je vais relire les tout... en prenant le temps de traduire un peu certains passages... l'anglais ce n'est pas ma force !:)
      Merci encore et désolée aussi pour se silence prolongé! Pas d'internet.. pas de cellulaire ...! ça fait du bien de temps en temps!

      Bonne journée :)
      0
  7. BillyV33
     
    je vais mette résolu pour ne pas éterniser

    Merci encore ! vous êtes d'un aide précieux!:):)
    0
  8. billyV33 Messages postés 24 Statut Membre
     
    je mets à résolu
    Merci beaucoup! :)
    0