Programación y Ejecución Diferida de Comandos en Sistemas Linux

Gestión de Tareas Diferidas con at

La utilidad at en entornos Linux está diseñada para programar la ejecución de comandos o scripts en un momento futuro específico. A diferencia de los programadores cíclicos, las tareas configuradas con at se ejecutan una única vez.

Sintaxis y Operaciones Básicas

Para crear una tarea diferida, se invoca el comando seguido de la especificación de tiempo, lo que abre un intérprete interactivo donde se ingresan los comandos. La entrada finaliza con Ctrl+D.

# Programar una tarea para las 14:30
at 14:30
at> echo "Iniciando proceso de limpieza" > /tmp/limpieza.log
at> <ctrl>
job 8 at Tue Nov 7 14:30:00 UTC 2023</ctrl>

Parámetros de Administración

El sistema proporciona diversas banderas para gestionar la cola de trabajos pendientes:

  • -l: Lista todas las tareas pendientes del usuario actual.
  • -r [id]: Elimina una tarea específica de la cola utilizando su identificador.
  • -c [id]: Imprime el script completo y las variables de entorno asociadas a una tarea.
  • -f [archivo]: Lee los comandos desde un archivo de texto en lugar de la entrada estándar.
  • -m: Fuerza el envío de una notificación por correo electrónico al usuario, incluso si el comando no genera salida estándar.
  • -M: Suprime cualquier notificación por correo, independientemente de si el comando genera salida.
# Ver la cola de tareas
at -l

# Inspeccionar el contenido de la tarea con ID 8
at -c 8

# Programar ejecución inmediata con notificación forzada
at -m now + 2 minutes
at> df -h > /dev/null
at> <ctrl></ctrl>

Control de Acceso y Permisos

La ejecución de at está regulada por dos archivos de configuración que actúan como listas de control de acceso. Si existe la lista blanca, la lista negra se ignora por completo.

  • Lista Negra (/etc/at.deny): Contiene los nombres de los usuarios a los que se les prohíbe usar at. Por defecto, este archivo puede existir y estar vacío, permitiendo el acceso a todos.
  • Lista Blanca (/etc/at.allow): Si este archivo existe, únicamente los usuarios listados aquí (y el superusuario root) pueden programar tareas. Todos los demás usuarios serán denegados.
# Denegar el uso de at al usuario 'devuser'
echo "devuser" >> /etc/at.deny

# Crear lista blanca para restringir el acceso solo a 'dbadmin'
touch /etc/at.allow
echo "dbadmin" > /etc/at.allow

Automatización Periódica con crontab

El demonio crond es el responsable de ejecutar tareas programadas de forma recurrente. Las configuraciones son persistentes y se almacenan en el sistema de archivos.

Configuración y Sintaxis

Los usuarios interactúan con el demonio mediante el comando crontab. Las opciones principales incluyen -e para editar, -l para listar y -r para eliminar la tabla completa del usuario.

La estructura de tiempo se define mediante cinco campos: minuto, hora, día del mes, mes, día de la semana, seguidos del comando a ejecutar.

# Editar la tabla cron del usuario actual
crontab -e

# Ejemplo de configuración:
# Ejecutar un script de respaldo todos los días a las 02:00 AM
0 2 * * * /usr/local/bin/backup_database.sh

# Ejecutar un comando cada 15 minutos
*/15 * * * * /usr/bin/php /var/www/html/queue_worker.php

Las definiciones de los usuarios se almacenan físicamente en el directorio /var/spool/cron/, donde cada archivo lleva el nombre del usuario propietario. Modificar estos archivos directamente con un editor de texto tiene el mismo efecto que usar crontab -e, aunque se recomienda usar la interfaz de línea de comandos para validar la sintaxis.

Restricciones de Usuario en Cron

Al igual que con at, el acceso a crontab se gestiona mediante archivos de denegación y permiso en el directorio /etc/.

  • /etc/cron.deny: Usuarios bloqueados para crear o modificar sus propias tablas cron.
  • /etc/cron.allow: Al crearse, anula la lista negra y restringe la ejecución exclusiva a los usuarios enumerados y a root.
# Bloquear a 'webuser' para que no pueda usar crontab
echo "webuser" >> /etc/cron.deny

# Habilitar lista blanca para permitir solo a 'sysadmin'
touch /etc/cron.allow
echo "sysadmin" > /etc/cron.allow

Definición de Tareas a Nivel de Sistema

Para administradores que necesitan configurar tareas para múltiples usuarios sin cambiar de contexto, se utiliza el directorio /etc/cron.d/. Los archivos en esta ubicación siguen la misma sintaxis de tiempo, pero incluyen un campo adicional para especificar el usuario bajo el cual se ejecutará el comando.

# Archivo: /etc/cron.d/mantenimiento_sistema
# Formato: min hora dia mes dia_semana USUARIO comando

# Limpiar sesiones expiradas cada hora como el usuario 'webapp'
0 * * * * webapp /usr/local/bin/clear_sessions.sh

# Rotar logs de la base de datos los domingos a las 03:30 como 'dbadmin'
30 3 * * 0 dbadmin /opt/db_scripts/rotate_logs.sh

# Verificar integridad del sistema cada día a medianoche como 'root'
0 0 * * * root /usr/sbin/aide --check

Etiquetas: linux at-command crontab cron-daemon system-administration

Publicado el 6-22 04:14