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.