SSD Nodes Learn 🎉 VPS desde $5.50/mes
Guías Matt ConnorPor Matt Connor

Comando watch en Linux: opciones y uso correcto

Aprende a usar watch en Linux: ajusta el intervalo, resalta cambios, sal al cambiar y cita tuberías para evitar errores al ejecutar comandos.

Qué hace el comando watch

El comando watch vuelve a ejecutar otro comando con un intervalo fijo y redibuja su salida en el mismo lugar de la pantalla. El intervalo predeterminado es de dos segundos. Úselo cuando espere que cambie un valor: cuando un disco se llena, un contenedor termina de iniciar, se completa una renovación de certificado o se vacía una cola.

watch forma parte de procps-ng y ya está instalado en un VPS Ubuntu o Debian recién creado como parte del paquete procps. Compruebe la versión antes de confiar en cualquiera de las opciones siguientes, porque dos de las opciones útiles son recientes.

watch --version

En Ubuntu 24.04, esto muestra una línea similar a watch from procps-ng 4.0.4. Este es el ejemplo útil más sencillo.

watch df -h /

La pantalla se borra y muestra una línea de encabezado, una línea en blanco y, después, la salida de df -h /:

Every 2.0s: df -h /                          server1: Sun Aug  9 10:21:44 2026

A la izquierda aparecen el intervalo y el comando exacto que watch está ejecutando. A la derecha aparecen el nombre de host y la hora actual. El reloj es la parte útil, porque demuestra que la pantalla se sigue actualizando aunque los valores de abajo no cambien. Pulse Ctrl+C para salir.

watch dibuja un marco que cabe en el terminal. Las líneas largas se ajustan, -w las trunca en su lugar y no dibuja nada que quede después de la última fila. No hay desplazamiento dentro del marco, porque cada ciclo sobrescribe el anterior. Este hecho determina para qué sirve watch en la mayoría de los casos.

¿Cada cuánto debe volver a ejecutar watch el comando?

Dos segundos es sólo el valor predeterminado. Elija el intervalo según la velocidad a la que cambia el valor y el coste de cada ejecución.

  • -n 0.5 para contadores que cambian constantemente, como ss -s o el recuento de bytes de una interfaz. El intervalo mínimo que acepta watch es de 0.1 segundos.
  • -n 30 o -n 60 para discos y certificados. Un sistema de archivos que se llena en un día no necesita treinta actualizaciones por minuto.

watch ejecuta el comando, espera a que termine y sólo después duerme durante el intervalo. El tiempo de ejecución se suma a la espera, por lo que un comando que tarda ocho segundos con -n 2 muestra una actualización cada diez segundos y mantiene la máquina ocupada durante todo ese tiempo. Añada -p (--precise) para que watch intente iniciar una ejecución cada cierto número de segundos, medido desde el inicio de una ejecución hasta el inicio de la siguiente.

Si siempre quiere usar otro valor predeterminado, exporte WATCH_INTERVAL en el perfil de su shell. Un -n explícito sigue teniendo prioridad. Ejecute watch --help para confirmar que su compilación lee esa variable.

Resalte los cambios con -d

Leer una pared de texto idéntico para encontrar el único campo que cambió de posición requiere mucho trabajo. -d (--differences) lo hace por usted.

watch -n 30 -d 'df -h / /var'

Los caracteres que difieren del fotograma anterior se muestran en vídeo inverso. Por eso, la celda Use% se ilumina en cuanto cambia de posición y todo lo demás permanece sin cambios. Si /var no es un sistema de archivos independiente, verá el sistema de archivos raíz listado dos veces. Es una forma rápida de saber cómo está particionado el sistema.

La comparación es posicional. Esto significa que watch alinea el fotograma nuevo con el anterior y compara los caracteres uno a uno. La salida cuyas columnas cambian de ancho se iluminará casi por completo. Por eso, prefiera comandos con un diseño estable. Las versiones actuales de procps-ng también aceptan watch --differences=permanent. Esta opción mantiene resaltada cada posición que haya cambiado alguna vez, en lugar de resaltar sólo el cambio más reciente. Confírmelo con watch --help antes de depender de este comportamiento.

¿Cómo hago que watch termine cuando cambie la salida?

-g (--chgexit) detiene watch la primera vez que la salida difiere de la ejecución anterior. El indicador vuelve a aparecer, por lo que puede escribir algo después en la misma línea.

watch -n 10 -g 'systemctl is-active myapp' ; echo 'state changed'

Esta es la opción que convierte watch en una herramienta para «avisarme cuando termine el despliegue». Tiene una trampa que afecta a todo el mundo: la comparación cubre toda la salida, por lo que cualquier reloj o PID (identificador de proceso) incluido en ella cambia en la primera actualización y watch termina de inmediato. systemctl status myapp muestra el tiempo transcurrido y el uso de memoria, por lo que -g no resulta útil. Reduzca el comando al único dato estable que está esperando; eso es lo que proporciona systemctl is-active.

Las versiones más recientes de procps-ng añaden la prueba opuesta, --equexit <cycles>, que termina después de que la salida permanezca sin cambios durante ese número de ciclos. Responde a la pregunta «avísame cuando esto se haya quedado inactivo». Compruebe watch --help, porque las versiones antiguas no incluyen esta opción.

¿Por qué watch ignora mi tubería y mi patrón glob?

Este es el fallo que todo el mundo encuentra una vez. La causa está en el shell y no en watch.

watch docker compose ps | grep web

El shell interactivo lee toda la línea antes de ejecutar nada. Después la divide en el carácter de tubería. Inicia watch docker compose ps y conecta la salida de pantalla del propio watch con grep. watch deja de escribir en un terminal, por lo que la pantalla aparece dañada o vacía, y grep filtra la salida de redibujado en lugar de una lista de contenedores.

Entrecomille toda la tubería para que llegue como un único argumento.

watch 'docker compose ps | grep web'

watch pasa esa cadena a sh -c, y ese shell ejecuta la tubería una vez por ciclo. Los patrones glob siguen la misma regla, aunque el síntoma es menos evidente.

watch ls -l /var/log/*.log
watch 'ls -l /var/log/*.log'

La primera línea expande el patrón glob una vez, en el shell, cuando pulsa Enter. Después watch vuelve a ejecutar una lista congelada de nombres de archivo, por lo que un archivo de registro creado un minuto más tarde nunca aparece. La segunda línea entrega el patrón glob a watch, que lo expande dentro de sh en cada ciclo. Así, los archivos nuevos aparecen automáticamente.

Las comillas también determinan cuándo se evalúa una variable o una sustitución de comandos. watch "echo $(date)" ejecuta date una vez, en el shell, y después repite esa cadena fija indefinidamente. watch 'echo $(date)' ejecuta date en cada ciclo. Las comillas simples significan después. Las comillas dobles significan ahora.

Hay otras dos consecuencias de sh -c:

  • Los alias y las funciones de shell no existen dentro de él. watch ll falla con sh: 1: ll: not found, porque sh -c nunca lee su .bashrc. Escriba el comando real o proporcione la ruta completa a un binario que sólo esté en su PATH interactivo.
  • Conviene capturar la salida de error estándar. Incluya 2>&1 entre las comillas cuando quiera que el texto de error aparezca dentro del marco, en lugar de quedar disperso por la pantalla.

Cuando las comillas resulten complicadas, -x (--exec) ejecuta el comando directamente, sin pasar por sh -c. Los argumentos que contienen espacios son más fáciles de manejar, y las tuberías y los patrones glob dejan de funcionar por completo, porque ya no hay ningún shell que los interprete.

Los privilegios siguen la misma lógica, porque watch es un proceso normal. watch 'sudo ss -tulpn' muestra una solicitud de contraseña que no puede ver ni completar. Ejecute sudo watch 'ss -tulpn' en su lugar y recuerde que todo el bucle se ejecutará como root hasta que pulse Ctrl+C.

Cuatro aspectos que conviene vigilar en un VPS

Un disco que se está llenando

watch -n 30 -d 'df -h / /var'

df pide al kernel datos que ya tiene, por lo que es suficientemente barato para repetirlo indefinidamente. du -sh /var/log no lo es, porque recorre todos los archivos del árbol en cada ciclo. Con watch, lee el disco de forma continua y ralentiza la máquina que intenta diagnosticar. Ejecute du una vez o use ncdu. Después, deje df bajo watch para saber si el número sigue aumentando.

Un contenedor que se reinicia continuamente

cd /srv/myapp
watch -n 5 -d 'docker compose ps'

La columna de estado muestra cuánto tiempo lleva activo cada contenedor. Un contenedor atrapado en un bucle de fallos vuelve continuamente a "Up 2 seconds", y -d lo muestra claramente de un vistazo. Cambie primero al directorio correcto, porque watch hereda el directorio de trabajo del shell que lo inició y docker compose necesita el directorio del proyecto. watch indica que se está produciendo un reinicio. docker compose logs -f web indica por qué. Cuando sepa la causa, convierta la solución en un healthcheck de Compose que reinicie el contenedor por usted para que nadie tenga que quedarse mirando una pantalla.

La renovación de un certificado

sudo -i
watch -n 60 -g 'openssl x509 -noout -enddate -in /etc/letsencrypt/live/example.com/fullchain.pem'

El comando imprime una línea, notAfter=Nov 7 09:14:22 2026 GMT, y nada más, por lo que -g se ejecuta exactamente cuando el archivo se sustituye por uno renovado. Los archivos de /etc/letsencrypt/live sólo los puede leer root, por eso se ejecuta desde un shell de root. Tenga en cuenta que vigila el certificado almacenado en disco. Un servidor web en ejecución mantiene el certificado antiguo en memoria hasta que se recarga. Compruebe qué certificado se está sirviendo realmente con echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate y no ejecute ese comando en intervalos de dos segundos contra un host público. La renovación corresponde a un servicio y un temporizador de systemd, y systemctl list-timers muestra cuándo se ejecutará de nuevo.

Una cola que se vacía

watch -n 15 'postqueue -p | tail -n 1'

Esto imprime una línea de resumen como -- 24 Kbytes in 6 Requests., o Mail queue is empty cuando termina. El mismo patrón sirve para cualquier cola cuyo tamaño pueda contar: watch -n 5 'find /srv/queue/incoming -type f | wc -l'.

Aquí watch alcanza su límite. Compara un frame con el frame anterior y no puede comprobar una condición, por lo que nunca puede decirle "el recuento llegó a cero". Un bucle de shell simple sí puede hacerlo mediante sustitución de comandos para capturar el recuento en cada iteración:

until [ "$(find /srv/queue/incoming -type f | wc -l)" -eq 0 ]; do sleep 5; done; echo 'queue drained'

Cuándo watch no es la herramienta adecuada

watch vuelve a ejecutar el comando sin conservar información de la ejecución anterior y sin saber qué hace ese comando. Esto es correcto para df. Es incorrecto en cuatro situaciones.

  • Registros. watch redibuja un marco fijo, por lo que se pierden las líneas que aparecen y se desplazan fuera de la pantalla entre dos ciclos. Use journalctl -fu nginx o tail -f, que transmiten las líneas nuevas a medida que se escriben.
  • Comandos costosos. du -sh / o una consulta a una base de datos con mucha carga se convierten en una carga permanente en segundo plano con cualquier intervalo, porque watch vuelve a iniciarlos continuamente.
  • Cualquier operación con efectos secundarios. Un comando que escribe, publica, reinicia o instala volverá a hacerlo en cada ciclo. Un curl contra una API cada dos segundos genera 43,200 solicitudes al día. Así es como se suspende una clave de API gratuita.
  • Comprobaciones de larga duración. watch se ejecuta en el terminal y termina con la sesión. No alerta a nadie ni conserva un historial después de cerrar el portátil. Para eso necesita un monitor de estado real, como Uptime Kuma, o una comprobación programada que se ejecute en el servidor.

El límite real es el tiempo. watch sirve para los diez minutos que dedica a esperar a que ocurra algo concreto. Todo lo que deba seguir comprobándose mañana debe ejecutarse mediante un temporizador programado o un monitor real.

Ejecute watch dentro de tmux cuando use SSH

En una sesión SSH, watch sólo es tan resistente como la conexión. Cuando el enlace se interrumpe, el shell recibe SIGHUP y watch termina con él. tmux evita este problema y hace que watch sea realmente útil en un servidor remoto.

tmux new -As ops
watch -n 30 -d 'df -h /'

Pulse Ctrl+b y, después, d para desconectar la sesión. El bucle seguirá ejecutándose en el servidor. Vuelva a conectarse más tarde con tmux attach -t ops y la pantalla seguirá actualizándose; el reloj de la cabecera lo confirma. Divida la ventana para mantener watch en un lado y journalctl -f en el otro. Ese es el objetivo de un espacio de trabajo de terminal basado en tmux. Cuando la misma consulta se aplica a varios servidores a la vez, debe usar una herramienta diseñada para administrar varios servidores Linux, no llenar la pantalla con paneles de watch.

Las pantallas mostradas son ilustrativas. La distribución de las columnas y las cadenas de versión varían entre distribuciones y versiones de procps-ng. Por tanto, consulte man watch en su propio equipo para conocer las opciones que admite realmente su compilación.

FAQ

¿Por qué watch ignora la tubería en watch mycmd | grep foo?

El shell divide la línea en la tubería antes de que watch se inicie. Por eso, envía la propia pantalla de watch a grep y la salida del comando nunca se filtra. Encierre toda la tubería entre comillas: watch 'mycmd | grep foo'. watch pasa ese único argumento a sh -c, que ejecuta la tubería una vez por ciclo. La misma regla se aplica a los patrones globales y a la sustitución de comandos.

¿Qué intervalo debo usar con watch?

Ajústelo a la velocidad con la que cambia el valor y al costo de cada ejecución. Medio segundo es adecuado para contadores rápidos, y 0.1 segundos es el intervalo mínimo que acepta watch. Entre treinta y sesenta segundos es adecuado para discos y certificados. La duración del comando se suma a la espera, salvo que pase -p. Por tanto, un comando lento con -n 1 se ejecuta de forma consecutiva y nunca hace una pausa.

¿Puede watch seguir un archivo de registro?

No. watch vuelve a dibujar una pantalla y no conserva el historial. Por tanto, cualquier línea que aparezca y desaparezca entre dos ciclos se pierde definitivamente. journalctl -fu <unit> y tail -f muestran las líneas nuevas a medida que llegan, que es lo que necesitan los registros. Use watch para valores que tengan un estado actual, como el porcentaje de uso de un disco o la longitud de una cola.

¿Cómo puedo hacer que watch se detenga cuando ocurra lo que estoy esperando?

Use -g (--chgexit) y proporciónele un comando cuya salida permanezca idéntica hasta que ocurra el evento. Una salida que contenga un reloj o un PID cambia en la primera actualización y provoca la salida inmediata. Por eso, systemctl is-active myapp funciona cuando systemctl status myapp no lo hace. Para una condición real, como que un contador llegue a cero, use un bucle until del shell, porque watch sólo puede detectar que la salida ha cambiado.

¿Por qué watch indica que no encuentra un comando que funciona en mi shell?

watch pasa el comando a sh -c, y ese shell no lee .bashrc. Por tanto, allí no existen sus alias ni sus funciones del shell. El mensaje suele ser sh: 1: ll: not found. Escriba el comando real completo o use la ruta absoluta para un binario que sólo esté disponible en su PATH interactivo.