Comment afficher les processus dynamiquement avec une entête statique

Fermé
BillyV33 - Modifié le 20 avril 2019 à 08:04
billyV33 Messages postés 23 Date d'inscription dimanche 10 février 2019 Statut Membre Dernière intervention 9 mars 2022 - 26 avril 2019 à 18:12
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

lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
19 avril 2019 à 22:02
ok...
top -d 2

!
0
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
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
20 avril 2019 à 00:07
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
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
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
20 avril 2019 à 01:42
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
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
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13 > BillyV33
Modifié le 20 avril 2019 à 04:49
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
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
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
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13 > BillyV33
20 avril 2019 à 18:00
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
#!/bin/sh

echo "je viens de voir le sh dans les choix!...vaut mieux tard que jamais!!!!"</code>
0
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13 > BillyV33
20 avril 2019 à 16:17
argh, non. toujours pas.
il manque la balise "ouvrante"
<code>
.
0
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
20 avril 2019 à 11:20
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
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
Bonjour sipe31,

Merci beaucoup pour ta suggestion !
je vais regarder ta ligne pour voir ce qu'elle retourne :)
0
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > BillyV33
20 avril 2019 à 16:51
Je crains que non (man ps (posix)) ;-\
0
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
je vais mette résolu pour ne pas éterniser

Merci encore ! vous êtes d'un aide précieux!:):)
0
billyV33 Messages postés 23 Date d'inscription dimanche 10 février 2019 Statut Membre Dernière intervention 9 mars 2022
26 avril 2019 à 18:12
je mets à résolu
Merci beaucoup! :)
0