Este artículo fue publicado originalmente en go2linux.org. El dominio ya no me pertenece, pero soy el autor original. Lo republico aquí en garron.me con correcciones y mejoras.

watch ejecuta un comando una y otra vez y muestra su salida a pantalla completa, para que veas cómo cambia sin tener que volver a escribirlo. Presiona Ctrl+C para salir.

Uso básico

watch [opciones] comando

Sin opciones, el comando se ejecuta cada 2 segundos:

watch free -h

La línea de encabezado muestra el intervalo, el comando, el nombre del equipo y la hora actual.

Cambiar el intervalo

Usa -n con el número de segundos:

watch -n 5 free -h

Se aceptan fracciones, hasta un mínimo de 0.1 segundos:

watch -n 0.5 date

Resaltar lo que cambió

-d resalta las diferencias entre una actualización y la siguiente:

watch -d free -h

El resaltado dura una sola actualización. Para mantener resaltado todo lo que cambió desde la primera ejecución, usa -d=permanent:

watch -d=permanent ls -l /var/log

Las versiones antiguas de watch documentaban este valor como cumulative.

Tuberías y comillas

Este es el error más común con watch:

watch ps aux | grep nginx

Aquí el shell envía la salida del propio watch a grep, que no es lo que quieres. Pon toda la tubería entre comillas para que sea watch quien la ejecute:

watch 'ps aux | grep nginx'

Usa comillas simples cuando el comando contiene variables con $ o sustituciones de comandos que deben evaluarse en cada ejecución, y no una sola vez al presionar Enter:

watch 'echo $(date +%s)'

Ocultar el encabezado

-t quita la línea de encabezado, lo que deja una pantalla más limpia y una línea más de salida:

watch -t date

Salir cuando la salida cambia

-g hace que watch termine en cuanto la salida es distinta a la de la ejecución anterior. Eso lo convierte en una herramienta sencilla para "esperar hasta que":

watch -g 'ls /mnt/backup' && echo "el directorio de respaldo cambió"

Esperar a que un archivo aparezca o crezca, y luego continuar con el siguiente comando:

watch -g -n 10 'stat -c %s dump.sql' ; notify-send "el volcado avanza"

Reaccionar ante errores

-b emite un pitido cuando el comando termina con un código distinto de cero. -e congela la pantalla en el error y sale después de presionar una tecla:

watch -e -n 30 'curl -fsS -o /dev/null https://www.example.com'

Mientras el sitio responda, la pantalla queda vacía. Al primer fallo, watch se detiene y muestra el error.

Conservar los colores

Muchos comandos desactivan los colores cuando no escriben en una terminal, y watch elimina las secuencias de escape por defecto. Fuerza el color en el comando y agrega -c para que watch lo interprete:

watch -c 'ls --color=always -l'

Los alias no funcionan dentro de watch

watch ejecuta el comando con sh -c, que no sabe nada de tus alias de Bash. watch ll falla aunque ll funcione en el prompt. Escribe el comando real, o define este alias — el espacio final hace que Bash expanda la palabra que sigue:

alias watch='watch '

Ejemplos prácticos

Espacio en disco mientras corre una copia grande:

watch -d df -h /home

Los diez procesos que más memoria usan:

watch -n 5 'ps aux --sort=-%mem | head -n 11'

Puertos en escucha:

watch -n 2 'ss -tulpn'

Número de conexiones a un servidor web:

watch -n 1 'ss -tn state established "( sport = :443 )" | wc -l'

Progreso de la reconstrucción de un RAID:

watch -n 10 cat /proc/mdstat

La alternativa con un bucle while

watch limpia la pantalla en cada ejecución. Cuando quieres los resultados uno debajo del otro para poder retroceder o guardarlos, usa un bucle:

while true; do date; free -h | grep Mem; sleep 5; done

Agrega | tee -a memoria.log después de done para conservar una copia.

Ver también

man watch — referencia completa.