Tutoriel Linux

Watch sous Linux : suivre une commande sans la relancer à la main

Débutant6 min de lecture
À retenirLinux n'est pas réservé aux experts. Le bon point de départ : une distribution accessible, une sauvegarde propre et quelques commandes comprises.

Vous relancez df -h, ss -s ou systemctl --failed toutes les quelques secondes pour voir si une valeur bouge. La commande watch automatise cette observation dans le terminal : elle exécute la même commande à intervalle régulier, remplace l’affichage précédent et peut surligner ce qui change.

Je l’utilise pour suivre un traitement, un espace disque ou l’état d’un service pendant une intervention courte. Il faut toutefois garder un point en tête : watch répète réellement la commande. Une instruction lente, coûteuse ou destructive sera donc relancée jusqu’à votre arrêt.

Tux surveille à intervalles réguliers les changements d’un serveur Linux
Watch répète une commande à intervalle régulier et met en évidence les changements observés.

Vérifier que watch est disponible

watch fait partie du paquet procps ou procps-ng selon la distribution. Contrôlez d’abord sa présence et sa version :

command -v watch
watch --version
watch --help

Si la commande manque, installez le paquet correspondant :

sudo apt install procps
sudo dnf install procps-ng
sudo pacman -S procps-ng

Les options disponibles peuvent varier légèrement avec la version de procps-ng. La page de manuel de watch reste la référence pour vérifier le comportement installé sur votre machine.

Rafraîchir une commande à l’intervalle choisi

Sans option, watch relance la commande toutes les deux secondes. Cet exemple surveille l’espace du point de montage /srv/data :

watch 'df -h /srv/data'

L’en-tête affiche l’intervalle, la commande et l’heure du dernier rafraîchissement. La sortie est remplacée à chaque passage, elle n’est pas ajoutée à l’écran comme dans un fichier de log.

Utilisez -n pour choisir l’intervalle en secondes. Ici, la commande est relancée toutes les cinq secondes :

watch -n 5 'df -h /srv/data'

Adaptez la fréquence au coût de la commande. Une seconde convient pour un compteur local léger. Pour une requête réseau, une API, un stockage lent ou une commande qui parcourt beaucoup de fichiers, partez plutôt sur cinq, dix ou trente secondes. Vérifiez d’abord sa durée sans watch :

time df -h /srv/data

L’option -p demande un rythme plus précis. Ne l’associez pas à une commande plus lente que l’intervalle : certaines versions peuvent enchaîner rapidement des exécutions pour rattraper le retard.

Surligner les changements au lieu de comparer à l’œil

L’option -d met en évidence les différences entre deux affichages successifs. Elle est utile pour suivre des connexions, une file de processus ou des compteurs système :

watch -d -n 1 'ss -s'
watch -d -n 2 'ps -eo pid,pcpu,pmem,comm --sort=-pcpu | head -n 12'
watch -d -n 5 'systemctl --failed --no-legend'

Pour une charge CPU ou mémoire, watch donne une vue ciblée mais sans navigation interactive. Le guide sur htop sous Linux est plus adapté si vous devez trier les processus, changer de colonne et remonter jusqu’au service responsable.

-g change encore l’usage : watch s’arrête dès que la sortie diffère. Vous pouvez ainsi attendre un changement d’état sans rester devant le terminal :

watch -g -n 2 'systemctl is-active nginx'

Cette commande quitte lorsque le texte renvoyé change. Relisez ensuite l’état complet et les logs avant de redémarrer quoi que ce soit :

systemctl status nginx --no-pager
journalctl -u nginx -n 50 --no-pager

Si vous devez inventorier les unités avant d’agir, consultez aussi le tutoriel consacré à systemctl et aux services Linux.

Comprendre les guillemets, les tubes et l’option -x

Par défaut, watch transmet la commande à sh -c. C’est pratique pour utiliser un tube, une redirection ou plusieurs instructions. Placez alors l’ensemble entre apostrophes afin que le shell lancé à chaque passage interprète la chaîne complète :

watch -n 2 'ps -eo pid,pcpu,pmem,comm --sort=-pmem | head -n 10'
watch -n 5 'date; df -h /srv/data'

Sans ces apostrophes, le tube peut être traité par votre shell actuel. watch ne reçoit alors qu’une partie de la commande, et le résultat ne correspond plus à ce que vous vouliez observer.

Quand vous n’avez besoin ni de tube ni de redirection, -x exécute directement le programme avec ses arguments. Cette forme réduit les problèmes d’échappement :

watch -n 2 -x df -h /srv/data

Gardez toutes les options de watch avant le nom de la commande. Le traitement des options s’arrête au premier argument qui n’est pas une option.

Ne pas transformer watch en boucle destructive

watch convient aux commandes de lecture : df, free, ss, ps, systemctl status ou une requête de santé. Il ne faut pas l’utiliser autour d’une action qui modifie le système.

  • Ne répétez pas rm, chmod, chown ou une commande de partitionnement.
  • Ne placez pas systemctl restart dans watch : vous redémarreriez le service à chaque intervalle.
  • Évitez d’y lancer apt update, une sauvegarde ou un script qui écrit en base.
  • Pour une API distante, choisissez un intervalle qui ne déclenche ni limitation ni charge inutile.

Pour un test HTTP en lecture seule, utilisez une route de santé prévue à cet effet et quittez sur erreur avec -e si votre version le propose :

watch -e -n 10 'curl -fsS http://127.0.0.1:8080/health'

Une boucle shell du type while true peut faire la même répétition, mais elle vous oblige à gérer l’effacement, le délai, les erreurs et l’arrêt. watch est plus propre pour une observation temporaire. Pour une supervision permanente, utilisez un outil de monitoring, un timer systemd ou un script qui journalise les résultats.

Arrêter watch et choisir le bon outil pour les logs

Appuyez sur Ctrl + C pour arrêter watch. Le processus observé doit se terminer avant le rafraîchissement suivant. Si la commande reste bloquée, ouvrez un second terminal pour identifier ses processus avant d’envoyer un signal.

pgrep -af watch
ps -o pid,ppid,stat,etime,cmd -p PID

Pour suivre un journal qui reçoit de nouvelles lignes, watch efface l’historique à chaque passage. Préférez journalctl -f pour une unité systemd ou tail -F pour un fichier qui peut être recréé par la rotation des logs :

journalctl -u nginx -f
tail -F /var/log/nginx/error.log

Le guide sur tail et le suivi des logs en direct détaille cette différence. Utilisez donc watch pour comparer des instantanés courts, puis passez à un outil qui conserve l’historique dès que l’ordre des événements devient important.

sudo apt update && sudo apt upgrade