Auteur Sujet: watch : exécuter un script toutes les secondes  (Lu 8912 fois)

0 Membres et 1 Invité sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 47 081
    • Twitter LaFibre.info
watch : exécuter un script toutes les secondes
« le: 23 juillet 2018 à 07:47:02 »
Watch - exécute un programme périodiquement, en affichant le résultat à l'écran

J'ai découvert le programme watch, présent dans toutes les distributions linux.

Pratique pour exécuter un script toutes les secondes :
watch -n 1 ./mon_script.sh


Le manuel :

watch - exécute un programme périodiquement, en affichant le résultat à l'écran

SYNOPSIS : watch [-dhvt] [-n <secondes>] [--differences[=cumulative]] [--help] [--interval=<secondes>] [--no-title] [--version] <commande>

DESCRIPTION : watch exécute la commande de manière répétée, et en affiche le résultat (le premier en plein écran). Cela vous permet d'observer les changements du résultat du programme au fil du temps. Par défaut, le programme est exécuté toutes les deux secondes ; utilisez -n ou --interval pour spécifier un intervalle différent.

L'option -d ou --differences mettra en évidence les différences entre les affichages successifs. L'utilisation conjointe de =cumulative permet de garder les mises en évidence des exécutions précédentes, offrant l'affichage de tout ce qui a changé depuis la première exécution. L'option -t ou --no-title désactive l'affichage de l'en-tête montrant la commande, l'intervalle et la date courante, ainsi que de la ligne blanche qui suit.

watch s'exécutera jusqu'à ce qu'il soit interrompu par l'utilisateur.


OPTIONS :
       -d, --differences [permanent]
              Surligner les différences entre les mises à jour successives. L'option lira un argument facultatif qui modifie la surbrillance de façon permanente, permettant de  voir  ce  qui  a  été
              modifié au moins une fois depuis la première itération.

       -n, --interval intervalle
              Indiquer l'intervalle de mise à jour, en seconde. La commande ne permet pas d'utiliser un intervalle plus rapide que 0,1 seconde, qui est la valeur utilisée à la place des valeurs plus
              petites.

       -p, --precise
              Essayer d'exécuter commande toutes les intervalle secondes. Essayez avec ntptime et regardez comme les fractions de seconde ne changent quasiment pas, contrairement au mode  normal  où
              elles augmentent continuellement.

       -t, --no-title
              Cacher l'en-tête contenant l'intervalle, la commande et la date actuelle en haut de l'affichage, ainsi que la ligne blanche qui suit.

       -b, --beep
              Émettre un bip lorsque le code de retour de la commande est non nul.

       -e, --errexit
              Geler les mises à jour en cas d'erreur de la commande et quitter après avoir appuyé sur une touche.

       -g, --chgexit
              Terminer quand la sortie de commande est modifiée.

       -c, --color
              Interpréter les suites de couleur ANSI.

       -x, --exec
              commande est passée en paramètre à sh -c, ce qui signifie que vous devrez parfois utiliser des guillemets supplèmentaires pour obtenir l'effet désiré. Ce comportement peut être modifié
              avec l'option --exec qui passe la commande à exec(2).

       -h, --help
              Afficher l'aide et quitter.

       -v, --version
              Afficher la version du logiciel et quitter.



NOTES : Notez que commande est passée en paramètre à « sh -c » ce qui signifie que vous devrez parfois utiliser des guillemets supplèmentaires pour obtenir l'effet désiré.

Notez que pour la reconnaissance des options, la norme POSIX est utilisée (le traitement des options s'arrête à la découverte du premier argument qui ne soit pas une option). Ça signifie que les options se trouvant après la commande ne seront pas interprétés par watch


EXEMPLES :
       Pour vérifier les courriels :
              watch -n 60 from

       Pour afficher les changements dans le contenu d'un répertoire :
              watch -d ls -l

       Pour n'afficher que les fichiers appartenant à arthur :
              watch -d 'ls -l | fgrep arthur'

       Pour vérifier l'effet des guillemets :
              watch echo $$
              watch echo '$$'
              watch echo "'"'$$'"'"

       Pour vérifier l'effet du temps de maintien de la précision, essayez en ajoutant -p à
              watch -n 10 sleep 1

       Notez que -p peut ne pas fonctionner entre deux redémarrages, à cause de ntpdate ou d'autres programmes modifiant la date au démarrage.


BOGUES
       Lors du redimensionnement d'un terminal, l'écran ne sera pas rafraîchi correctement avant la prochaine exécution. Les mises en évidence dues à --differences sont également perdues.

       Les caractères non imprimables de la sortie du programme sont ignorés. Utilisez « cat -v » pour les afficher.

       La combinaison de caractères supposés s'afficher en dernière colonne de l'écran risque de s'afficher dans la colonne précédente ou pas du tout.

       Les combinaisons de caractères ne sont jamais considérées différentes en mode --differences. Seul le caractère de base est considéré.

       Les lignes blanches qui suivent directement une ligne s'arrêtant en dernière colonne ne sont pas affichées

       Le  mode --precise ne dispose pas encore de fonctions de temporisation pour compenser une commande dont le temps d'exécution est supérieure à secondes secondes. watch peut également lancer en
       rafales autant d'exécution de commande que possible pour rattraper une exécution précédente qui aurait pris plus de secondes secondes à s'exécuter (par  exemple,  netstat  prend  beaucoup  de
       temps pour effectuer une interrogation DNS).

CODES DE RETOUR
              0      Réussite.
              1      Erreurs diverses.
              2      Échec lors du dédoublement (« fork ») du processus à observer.
              3      Échec de remplacement de la sortie standard du processus fils par une écriture vers le tube.
              4      Échec d'exécution de la commande.
              5      Échec de la fermeture d'écriture vers le tube du processus fils.
              7      Échec de la création du tube IPC.
              8      Le processus fils n'a pas pu renvoyer une valeur avec waitpid(2) ou la commande s'est terminée en erreur.
              autre  L'observation propagera l'état du code de retour en tant que code de retour du fils.


AUTEURS : Le programme watch original a été écrit par Tony Rems <rembo@unisoft.com> en 1991 et des modifications et corrections ont été apportées par François Pinard. Mike Coleman <mkc@acm.org> l'a retravaillé et y a ajouté des fonctionnalités en 1999.
TRADUCTION : Amand Tihon <amand@alrj.org>, 2001

Hugues

  • AS2027 MilkyWan
  • Modérateur
  • *
  • Messages: 12 424
  • Lyon (69) / St-Bernard (01)
    • Twitter
watch : exécuter un script toutes les secondes
« Réponse #1 le: 23 juillet 2018 à 09:46:00 »
Pratique pour exécuter un script toutes les secondes :
Ah non non non ! Pour ça on fait une boucle et un sleep ! Watch sert si tu as besoin de voir un changement en "direct" !

vivien

  • Administrateur
  • *
  • Messages: 47 081
    • Twitter LaFibre.info
watch : exécuter un script toutes les secondes
« Réponse #2 le: 23 juillet 2018 à 10:30:57 »
C'est différent, le sleep va faire que tu exécute le process suivant un temps précis après sa fin.

Par exemple pour des tests j'utilise crontab pour éviter le pb des sleep, car j'ai besoin d'un même nombre de test pr heure et avec sleep cela peut varier en fonction de la durée des tests.

J'ai par contre rajouté un test qui vérifie si un fichier test est présent pour ne pas executer le test si le précédent n'est pas terminé.

En perl cela donne :
############# Test si un script est déjà en cours d'execution
my $time_log = localtime(time);
if (-e "$fichier_log") {
die "===> Kill $time_log : Test précédent non terminé\n";
}
open(LOG, ">>$fichier_log") || die "===> Kill $time_log : Impossible d'ouvrir le fichier de log $fichier_log";
print LOG ("$time_log : Début du script\n");

Optix

  • AS41114 - Expert OrneTHD
  • Abonné Orne THD
  • *
  • Messages: 4 644
  • WOOHOO !
    • OrneTHD
watch : exécuter un script toutes les secondes
« Réponse #3 le: 23 juillet 2018 à 10:40:45 »
Ah non non non ! Pour ça on fait une boucle et un sleep ! Watch sert si tu as besoin de voir un changement en "direct" !
Pour info, une boucle infinie c'est dangereux, dans la mesure où tu n'es pas protégé contre les fuites de mémoire. Donc un programme va potentiellement te bouffer de la RAM à chaque itération jusqu'à ce que fasse pouf.

L'avantage du watch c'est que le programme se termine à la fin de son traitement, et libère la mémoire consommée. Mais consomme davantage de CPU pour se relancer.

underground78

  • Expert
  • Abonné Free fibre
  • *
  • Messages: 7 434
  • Orsay (91)
    • FreePON : suivi géographique du déploiement fibre EPON chez Free
watch : exécuter un script toutes les secondes
« Réponse #4 le: 23 juillet 2018 à 15:09:15 »
Ah non non non ! Pour ça on fait une boucle et un sleep ! Watch sert si tu as besoin de voir un changement en "direct" !
C'est exactement ce que fait watch : https://gitlab.com/procps-ng/procps/blob/master/watch.c#L819.

Hugues

  • AS2027 MilkyWan
  • Modérateur
  • *
  • Messages: 12 424
  • Lyon (69) / St-Bernard (01)
    • Twitter
watch : exécuter un script toutes les secondes
« Réponse #5 le: 23 juillet 2018 à 16:43:51 »
Je maintiens qu'utiliser watch pour des utilisations non graphiques, c'est moche :)

underground78

  • Expert
  • Abonné Free fibre
  • *
  • Messages: 7 434
  • Orsay (91)
    • FreePON : suivi géographique du déploiement fibre EPON chez Free
watch : exécuter un script toutes les secondes
« Réponse #6 le: 23 juillet 2018 à 18:47:03 »
Pour moi un script qui affiche quelque chose à l'écran c'est bien une utilisation "graphique".

Hugues

  • AS2027 MilkyWan
  • Modérateur
  • *
  • Messages: 12 424
  • Lyon (69) / St-Bernard (01)
    • Twitter
watch : exécuter un script toutes les secondes
« Réponse #7 le: 23 juillet 2018 à 21:44:24 »
A l'écran oui. Ce n'est pas le cas de l'exemple de vivien !

underground78

  • Expert
  • Abonné Free fibre
  • *
  • Messages: 7 434
  • Orsay (91)
    • FreePON : suivi géographique du déploiement fibre EPON chez Free
watch : exécuter un script toutes les secondes
« Réponse #8 le: 24 juillet 2018 à 08:51:53 »
Ce n'est pas ce que j'ai compris mais on est d'accord sur le fond.

Aerendil

  • Abonné Orange Fibre
  • *
  • Messages: 354
  • Cormeilles-en-Parisis 95
watch : exécuter un script toutes les secondes
« Réponse #9 le: 24 juillet 2018 à 16:12:01 »

DESCRIPTION : watch exécute la commande de manière répétée, et en affiche le résultat (le premier en plein écran). Cela vous permet d'observer les changements du résultat du programme au fil du temps. Par défaut, le programme est exécuté toutes les deux secondes ; utilisez -n ou --interval pour spécifier un intervalle différent.

Hugues 0 Underground 1 ;)

Hugues

  • AS2027 MilkyWan
  • Modérateur
  • *
  • Messages: 12 424
  • Lyon (69) / St-Bernard (01)
    • Twitter
watch : exécuter un script toutes les secondes
« Réponse #10 le: 24 juillet 2018 à 20:12:29 »
Il dit qu'il ne voit pas le rapport et trouve ton message très con.

doctorrock

  • Abonné Orange Fibre
  • *
  • Messages: 931
  • Draguignan 83
watch : exécuter un script toutes les secondes
« Réponse #11 le: 07 août 2018 à 17:12:27 »
Whao , j'utilise watch depuis .... so long :-D

Simple network monitor :   watch -d -n1 netstat -sSimple memory analyzer : watch -d -n1 cat /proc/42/smaps

Etc...  , j'en ai à la pelle comme ca , sur procfs  :-D