¿Cómo repetir un comando cada N segundos en Linux?

Publicado 17 de octubre de 2024

Problema: Repetir comandos de Linux a intervalos

Automatizar la ejecución de comandos a intervalos regulares es una tarea común en sistemas Linux. Esto puede ser útil para monitorear recursos del sistema, ejecutar tareas periódicas o actualizar información en momentos determinados.

El comando 'watch': Una solución simple

Sintaxis básica del comando 'watch'

El comando 'watch' en Linux ejecuta comandos repetidamente a intervalos establecidos. Es una herramienta incorporada que muestra la salida de un comando en pantalla completa, actualizándola regularmente.

Para usar el comando 'watch', sigue esta sintaxis básica:

watch [opciones] comando

El comando que deseas repetir va al final del comando 'watch'. Por defecto, 'watch' ejecuta el comando especificado cada 2 segundos.

Para establecer un intervalo de tiempo personalizado entre repeticiones, usa la opción '-n' seguida del número de segundos. Por ejemplo:

watch -n 5 comando

Esto ejecutará el comando cada 5 segundos.

También puedes usar valores decimales para intervalos más cortos:

watch -n 0.5 comando

Esto ejecuta el comando cada medio segundo.

El comando 'watch' se ejecuta hasta que lo detengas manualmente, generalmente presionando Ctrl+C.

Consejo: Resaltar cambios

Para resaltar los cambios entre actualizaciones, usa la opción '-d' o '--differences'. Esto facilita detectar lo que está cambiando en la salida del comando:

watch -d comando

Esto resaltará cualquier diferencia en la salida entre actualizaciones, facilitando el seguimiento de los cambios a lo largo del tiempo.

Ejemplos prácticos de uso de 'watch'

Monitorear cambios en el tamaño de archivos

El comando 'watch' ayuda a monitorear cambios en el tamaño de archivos, útil durante importaciones o descargas de archivos. Para rastrear cambios en el tamaño de archivos, usa 'watch' con el comando 'ls':

watch -n 5 ls -l nombrearchivo

Este comando muestra los detalles del archivo, incluyendo el tamaño, cada 5 segundos. Es útil cuando importas archivos grandes y quieres ver si el tamaño está aumentando.

Para monitorear múltiples archivos en un directorio, usa:

watch -n 5 'ls -l | grep nombrearchivo'

Esto muestra los detalles de todos los archivos con 'nombrearchivo' en su nombre, actualizándose cada 5 segundos.

Consejo: Resaltar cambios

Usa la opción -d con 'watch' para resaltar las diferencias entre actualizaciones. Por ejemplo:

watch -d -n 5 ls -l nombrearchivo

Esto resaltará cualquier cambio en los detalles del archivo, facilitando la detección de modificaciones.

Observar el uso de recursos del sistema

'watch' también es útil para monitorear los recursos del sistema en tiempo real. Para observar el uso de CPU, úsalo con el comando 'top':

watch -n 1 'top -b -n 1 | head -n 5'

Esto muestra las primeras 5 líneas de la salida del comando 'top', actualizándose cada segundo.

Para monitorear el uso de memoria, combina 'watch' con el comando 'free':

watch -n 2 free -m

Esto muestra el uso de memoria en megabytes, actualizándose cada 2 segundos.

Para monitorear el uso del disco, usa 'watch' con el comando 'df':

watch -n 10 df -h

Esto muestra el uso del disco en un formato legible, actualizándose cada 10 segundos.

Personalizar la salida de 'watch'

Resaltar cambios con '--differences'

La opción '--differences' en el comando 'watch' hace que los cambios sean más visibles en las salidas repetidas. Esta opción resalta las partes de la salida que han cambiado desde la última actualización.

Para usar esta función, agrega la bandera '-d' o '--differences' a tu comando 'watch':

watch -d comando

Esto es útil cuando se monitorean pequeños cambios en salidas grandes. Por ejemplo, al observar los procesos del sistema:

watch -d 'ps aux | sort -nrk 3,3 | head -n 5'

Este comando muestra los 5 procesos que más consumen CPU y resalta cualquier cambio en las actualizaciones.

Consejo: Mejorar la legibilidad con color

Usa la opción '--color' junto con '--differences' para hacer los cambios aún más notorios. Por ejemplo:

watch -d --color 'df -h'

Este comando mostrará información sobre el uso del disco y resaltará los cambios en color, facilitando la detección de modificaciones en el uso del espacio en disco a lo largo del tiempo.

Usar la opción '--cumulative'

La opción '--cumulative' en 'watch' proporciona un resaltado acumulativo, lo que significa que mantiene un registro de todos los cambios a lo largo del tiempo, no solo de los más recientes.

Para usar esta opción, agrega '--cumulative' a tu comando 'watch':

watch --cumulative comando

Esta función es útil para rastrear todos los cambios que han ocurrido desde que comenzaste a observar. Por ejemplo, al monitorear archivos de registro:

watch --cumulative 'tail -n 10 /var/log/syslog'

Este comando muestra las últimas 10 líneas del registro del sistema y resalta todas las nuevas entradas que han aparecido desde que comenzaste a observar.

La opción '--cumulative' ayuda en escenarios donde necesitas mantener un registro de todos los cambios durante un largo período, en lugar de solo los más recientes.

Métodos alternativos para la repetición de comandos

Usar bucles en Bash

Los bucles en Bash son otra forma de repetir comandos en Linux. Puedes crear un bucle para ejecutar un comando varias veces:

while true; do
    comando
    sleep 5
done

Este bucle ejecuta el comando cada 5 segundos hasta que lo detengas manualmente (generalmente con Ctrl+C).

Ventajas de usar bucles en bash:

  • Más flexibles para secuencias de comandos complejas
  • Se pueden modificar para diferentes intervalos o condiciones
  • Funcionan en todos los entornos de shell

Desventajas comparadas con 'watch':

  • No proporcionan actualización automática de la salida
  • Requieren más configuración
  • Pueden ser menos eficientes para repeticiones simples de un solo comando

Consejo: Personalizar el comportamiento del bucle

Puedes agregar declaraciones condicionales dentro del bucle para controlar su comportamiento. Por ejemplo:

count=0
while [ $count -lt 10 ]; do
    comando
    sleep 5
    ((count++))
done

Este bucle ejecutará el comando 10 veces antes de detenerse.

Tareas Cron para repeticiones programadas

Las tareas Cron son útiles para programar comandos que se ejecuten en momentos o intervalos específicos, especialmente para períodos más largos:

Para configurar una tarea Cron, edita el archivo crontab:

crontab -e

Luego agrega una línea como esta para ejecutar un comando cada 30 minutos:

*/30 * * * * /ruta/a/tu/comando

Cron es mejor que 'watch' cuando:

  • Necesitas ejecutar comandos en momentos específicos
  • El intervalo entre repeticiones es largo (horas, días, semanas)
  • Quieres que el comando se ejecute en segundo plano
  • Necesitas mantener el comando en ejecución incluso después de cerrar sesión

Sin embargo, 'watch' es más adecuado para:

  • Monitoreo en tiempo real con intervalos más cortos
  • Sesiones interactivas donde necesitas ver la salida inmediatamente
  • Repetición temporal de comandos durante una sola sesión

Los bucles en Bash y las tareas Cron proporcionan alternativas a 'watch' para repetir comandos, cada uno con sus propias fortalezas según el caso de uso específico.