Linux / Commande watch : répéter une commande et suivre ses résultats

watch est une commande qui exécute de manière répétée une commande spécifiée à intervalles réguliers et met à jour l'ensemble de l'écran du terminal avec les résultats. L’intervalle par défaut est de 2 secondes, sauf si la variable WATCH_INTERVAL le modifie, et vous pouvez changer l'intervalle avec -n et mettre en évidence les parties qui ont changé par rapport aux résultats précédents avec -d.

Elle est utile lorsqu'on observe des valeurs qui changent continuellement, telles que la mémoire, le disque, le processus ou l'état du réseau, sur une courte période. Pour quitter, vous utilisez généralement q ou Ctrl+c.

Qu'est-ce que la commande watch ?

watch est un programme inclus dans l'ensemble d'outils procps-ng. Il relance la commande et affiche sa sortie standard et sa sortie d’erreur dans l’espace disponible du terminal, ce qui vous permet de vérifier les changements de résultat sans avoir à saisir la même commande plusieurs fois.

En haut de l'écran par défaut, des informations telles que l'intervalle d'exécution, la commande exécutée, l'hôte, l'heure et l'état de terminaison sont affichées. Si les résultats de l'exécution sont plus longs que l'écran, certaines parties peuvent être cachées, donc d'autres outils peuvent être plus adaptés pour suivre de longs journaux ou de grandes quantités de sortie.

Vous pouvez vérifier le comportement par défaut et les options actuelles dans le manuel watch(1) et le manuel source procps-ng watch.

Syntaxe de base et utilisation

watch [option] command [command arguments...]

Si vous exécutez free -h de manière répétée sans aucune option, l'utilisation de la mémoire est mise à jour toutes les 2 secondes par défaut.

watch free -h

Pour exécuter à des intervalles d'une seconde, ajoutez l'option -n.

watch -n 1 free -h

L'option watch doit être placée avant la commande à répéter. Les options écrites après la commande sont généralement passées à la commande répétée, pas à watch.

Ces exemples demandent un terminal interactif et les commandes indiquées. Si watch manque, cherchez le paquet procps ou procps-ng de votre distribution. Pour comprendre les colonnes de mémoire, consultez le guide de free.

Options fréquemment utilisées

Option Fonction Utilisation
-n seconds Spécifier l'intervalle d'exécution Spécifiez une valeur de temps en secondes comme watch -n 1 command.
-d Mettre en évidence les parties modifiées Met en évidence les caractères qui ont changé par rapport à l'écran précédent.
-d=permanent Mise en évidence cumulative des changements Continue à mettre en évidence toutes les parties qui ont changé au moins une fois depuis la première exécution.
-g Quitter lorsque la sortie change Peut être utilisé pour attendre jusqu'à ce qu'un fichier ou un statut change.
-e Arrêter la mise à jour en cas d'erreur de commande Si la commande répétée se termine avec un statut non nul, elle met en pause l'écran et quitte après une pression sur une touche.
-b Bip en cas d'erreur de commande Si la commande répétée retourne un état non nul, elle fera sonner la cloche du terminal.
-p Tenter des intervalles de départ exacts Exécuter selon l'intervalle spécifié basé sur l'heure de début de l'exécution précédente.
-t Cacher le titre en haut Libérer un peu plus d'espace pour afficher les résultats de la commande.
-c Interpréter les couleurs ANSI Afficher les couleurs et styles pris en charge par la commande répétée.
-w Empêcher le retour à la ligne des lignes longues Affiche les lignes qui dépassent la largeur de l'écran en les coupant au lieu de les renvoyer à la ligne suivante.
-x Exécuter sans passer par le shell Au lieu de sh -c, exécutez les programmes directement sans utiliser l'expansion du shell et les pipes.

Les options prises en charge peuvent varier selon la version de procps-ng incluse dans la distribution. Vous pouvez vérifier les options disponibles sur votre système actuel avec la commande suivante.

watch --help
watch --version

Contrôle de l'intervalle et des changements de sortie

Spécifiez l'intervalle d'exécution avec -n

Spécifiez une valeur en secondes après -n ou --interval. Vous pouvez également utiliser des décimales, mais un intervalle trop court peut imposer une charge inutile sur le processeur (CPU, Central Processing Unit), le disque, le réseau et les services cibles.

watch -n 0.5 date
watch -n 5 df -h

Si l'intervalle est omis, la valeur par défaut est de 2 secondes. Dans le manuel actuel de procps-ng, une limite est appliquée aux valeurs excessivement petites ou grandes, et il est recommandé de vérifier la plage spécifique dans la version installée.

Mettez en évidence les changements avec -d

-d met en évidence les parties qui ont changé en comparant l'écran actuel avec le précédent. Cela est pratique lors de la consultation des statistiques de mémoire, de processus et de réseau qui changent rapidement.

watch -n 1 -d free -h

Pour afficher en continu tous les emplacements modifiés après le premier écran, utilisez -d=permanent si la version installée le permet.

watch -n 1 -d=permanent free -h

Quittez lorsque des modifications se produisent avec -g

-g ou --chgexit quitte watch lorsque la sortie visible à l'écran change. Il peut être utilisé lorsque vous attendez des modifications du temps des fichiers ou des statuts des tâches de déploiement.

Dans un premier terminal Bash, créez un fichier temporaire puis lancez cette surveillance. La ligne affichée juste avant watch est la commande à copier dans un second terminal pour modifier l’horodatage du fichier.

watch_demo=$(mktemp -d) || exit 1
printf '%s\n' initial > "$watch_demo/result.txt"
printf 'touch -- %q\n' "$watch_demo/result.txt"
watch -x -g -n 1 stat -c %y -- "$watch_demo/result.txt"

Après avoir exécuté cette commande touch dans le second terminal, l’horodatage visible change et watch -g doit se terminer. Le format GNU %y affiche une date lisible et sa fraction de seconde lorsqu’elle est disponible. -x conserve ici les arguments sans passer par un shell enfant. Après le test, vérifiez le chemin contenu dans watch_demo, puis supprimez le fichier d’essai et son dossier.

Si la sortie ne change que dans des zones coupées par la plage de l'écran, les modifications peuvent ne pas être détectées. Pour l'automatisation où la détection des changements est critique, il est plus sûr d'utiliser le statut de sortie de la commande cible ou des outils de surveillance dédiés plutôt que de comparer la sortie de l'écran.

Pourquoi des guillemets sont nécessaires lors de l'utilisation de pipes et de la syntaxe du shell

Par défaut, watch exécute la commande passée via sh -c. Si vous voulez utiliser des pipes, des redirections, des points-virgules, des variables et des caractères génériques dans le cadre de la commande répétée, il est plus clair d'encapsuler l'ensemble de la commande entre guillemets simples.

Exécuter une commande simple

Les commandes sans pipes ni redirection peuvent être écrites directement ainsi.

watch -n 2 ls -lh /var/log

Pipes et variables : encapsulez l'ensemble de la commande

Dans l'exemple suivant, les guillemets simples empêchent le shell actuel de traiter le pipe en premier et transmettent l'ensemble de la commande au shell qui l'exécutera de manière répétée.

watch -n 1 'ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head -n 15'

La redirection ou les commandes multiples sont encapsulées de la même manière.

watch -n 5 'date; df -h / /var'

L'option -x exécute le programme directement sans passer par le shell. Cela peut légèrement réduire le coût d'exécution et simplifier le passage des arguments, mais les fonctionnalités du shell comme les pipes, la redirection, l'expansion des variables et les caractères génériques ne peuvent pas être utilisées.

watch -x -n 2 ls -lh /var/log

Avec -x, votre shell courant peut encore effectuer ses propres expansions avant l’appel à watch. Par exemple, un chemin contenant une espace doit rester entouré de guillemets : watch -x -n 2 ls -l -- "$HOME/mon dossier". Le dossier doit exister ; -x conserve cet argument unique sans demander au shell enfant de le découper à nouveau.

Le comportement général des guillemets peut être trouvé dans la documentation GNU Bash Quoting.

Exemples fréquemment utilisés en pratique

Éléments à vérifier Description
Mémoire Met à jour le résultat de free -h toutes les secondes et met en évidence les parties modifiées.
Espace disque Vérifie l'utilisation des systèmes de fichiers root et /var toutes les 5 secondes.
Processus consommant du CPU Trie les résultats ps par utilisation du CPU et affiche les premières entrées.
Résumé des sockets Vérifiez l'état général des sockets réseau de manière répétée avec ss -s.
Taille du fichier Observez les changements de taille des fichiers téléchargés ou compressés avec stat.
État du service Exécutez systemctl status de manière répétée avec --no-pager.

Utilisation de la mémoire

watch -n 1 -d free -h

Utilisation du disque

watch -n 5 'df -h / /var'

Processus avec une forte utilisation du CPU

watch -n 1 'ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head -n 15'

Le pourcentage CPU affiché par ps correspond au temps processeur rapporté au temps écoulé depuis le lancement du processus ; ce n’est pas une mesure instantanée entre deux rafraîchissements. Pour examiner l’évolution récente, top est généralement plus adapté.

Résumé des sockets réseau

watch -n 1 ss -s

Taille du fichier et date de modification

Le fichier archive.tar doit déjà exister. Adaptez son chemin au fichier à observer ; cette commande ne lance pas elle-même un téléchargement.

watch -n 1 'stat -c "%s bytes  %y" archive.tar'

État du service

L’exemple suivant suppose un système utilisant systemd avec l’unité nginx installée. Remplacez ce nom par une unité existante de votre système.

watch -n 2 'systemctl --no-pager --full status nginx'

Les commandes qui peuvent produire une sortie longue, comme le statut du service, ne peuvent s'afficher que partiellement en fonction de la taille du terminal. Si le but est le suivi continu des journaux, une commande adaptée à cette fonction, telle que journalctl -f -u nginx, est plus appropriée.

Intervalles d'exécution exacts et commandes de longue durée

Dans le comportement par défaut, après l'exécution d'une seule commande, elle attend l'intervalle spécifié avant de commencer la prochaine exécution. L'utilisation de -p ou --precise tente d'aligner le prochain démarrage en fonction du moment où la commande précédente a commencé.

watch -p -n 2 'date; sleep 1'

Pour comparer, lancez d’abord watch -n 2 'date; sleep 1', puis la version avec -p ci-dessus, en quittant entre les deux essais. Le démarrage passe approximativement de trois secondes à deux secondes d’intervalle. Remplacez ensuite uniquement sleep 1 par sleep 3 pour observer une commande plus lente que l’intervalle ; revenez à sleep 1 après l’essai. L’ordonnancement du système peut ajouter du retard.

Si le temps d’exécution d’une commande répétée est supérieur à l'intervalle spécifié, watch ne lancera pas plusieurs instances simultanément, mais attendra que la commande en cours se termine. Pour les tâches en lot qui nécessitent des cycles exacts et une exécution garantie, l'utilisation d'un minuteur systemd ou d'un planificateur de tâches est plus adaptée que watch.

Contrôle avec le clavier

Touche Action
q Quitte watch. La commande enfant en cours peut ne pas s'arrêter immédiatement.
Ctrl+c Interrompt watch et sa commande en cours, contrairement à q. Les détails dépendent de la version ; vérifiez aussi les tâches que la commande aurait lancées en arrière-plan.
Space Demande l'exécution de la commande sans attendre le prochain moment programmé. Si elle est déjà en cours, elle commence la prochaine exécution immédiatement après l'achèvement, sans délai.

Les actions clés peuvent varier en fonction de la version de procps-ng, il faut donc d'abord vérifier le man watch du système actuel.

Précautions lors de l'utilisation de watch

  • Il est préférable de l'utiliser pour les commandes de vérification en lecture seule : Répéter des commandes qui modifient l'état, telles que supprimer, créer un utilisateur ou redémarrer un service, peut entraîner des résultats indésirables.
  • Évitez les intervalles très courts : Exécuter des requêtes de base de données, des appels API distants ou des recherches dans de grands répertoires à des intervalles très courts peut surcharger le système ou les services externes.
  • Vérifiez la plage visible à l'écran : -g et -d sont affectés par la sortie affichée dans le terminal, donc les modifications dans la zone tronquée peuvent ne pas être détectées.
  • Évitez les commandes interactives : Les programmes qui attendent une entrée de l'utilisateur, tels que les invitations de mot de passe, les éditeurs ou les pagers, ne conviennent pas à une exécution répétée.
  • Distinguer le statut de sortie : Le statut de succès du watch de base ne signifie pas toujours que la commande répétée a réussi. Si vous devez répondre aux erreurs de commande, vérifiez des options comme -e dans la version actuelle.

Quand d'autres outils sont plus appropriés que watch

Objectif Outils appropriés
Suivi des journaux ajoutés à un fichier tail -f ou tail -F
Suivi des journaux de service systemd journalctl -f -u service_name
Vérification de l'utilisation des ressources des processus top ou htop
Tâches répétitives planifiées minuteur systemd ou cron
Collecte de métriques à long terme et alertes Système de surveillance dédié

watch convient à une personne pour observer les changements à court terme sur le terminal. Si vous avez besoin de conservation des enregistrements, de notifications et d'analyse à long terme, vous devez choisir un outil approprié à cet objectif.

Questions fréquemment posées

Il indique que la commande watch n'existe pas

watch est généralement inclus dans le paquet procps ou procps-ng. Il peut ne pas être présent dans les environnements d’installation minimale, vous devez donc installer le paquet en utilisant le gestionnaire de paquets de votre distribution actuelle. Consultez la documentation de la distribution pour le nom du paquet et la commande d'installation.

Les alias ou les fonctions shell ne s'exécutent pas à l'intérieur de watch

Les alias et fonctions définis dans votre shell interactif ne sont généralement pas repris dans le nouveau shell sh -c appelé par watch. Pour les tâches répétitives, il est plus facile d'utiliser de manière prévisible l'exécutable réel, une commande explicite ou un script shell séparé.

Les couleurs de commande ne sont pas affichées

Activez l'interprétation des couleurs ANSI avec watch -c, et configurez la commande répétée pour qu'elle affiche également les codes de couleur dans les environnements non interactifs. Selon le programme, une option séparée comme --color=always peut être nécessaire.

Pourquoi les commandes qui incluent des pipelines doivent-elles être entourées de guillemets ?

Sans guillemets, le shell actuel peut traiter le tuyau en premier, ce qui fait que la totalité de la sortie de watch est transmise à une autre commande. En mettant toute la chaîne de commandes entre guillemets simples, watch peut la transmettre comme une seule chaîne de commande au shell qui l’exécutera de manière répétée.

Résumé

watch est un outil d’observation simple qui affiche de manière répétée les résultats d’une commande à l’intervalle par défaut de 2 secondes. Vous pouvez modifier l’intervalle avec -n, mettre en évidence les changements avec -d, et quitter lorsque la sortie change avec -g.

Les commandes qui incluent des pipes et des redirections doivent être entièrement entourées de guillemets simples, et la charge ainsi que les effets secondaires d'une exécution répétée sur le système doivent être vérifiés. Vous pouvez trouver les objectifs des autres commandes par tâche dans la liste des commandes Linux.