Curso de Linux / Programar tareas con cron y temporizadores de systemd

Las tareas programadas de Linux pueden usar cron para horarios simples, y los temporizadores de systemd para tareas que requieren gestión junto con el estado del servicio o los registros. Además de comprobar que estén registradas, verifique la interpretación del cronograma, los registros de ejecución reales, los archivos de resultados y el estado de fallos por separado.

La orden a programar debe registrarse después de ejecutarla directamente y verificar los resultados, como se explica en Conceptos básicos de Bash. El funcionamiento después de cerrar sesión del administrador del systemd del usuario y la configuración de linger deben comprobarse en la VM real, y no se debe asumir que seguirá ejecutándose solo con registrar el temporizador.

Los ejemplos de configuración se orientan a máquinas virtuales con instalaciones habituales de Ubuntu 26.04 LTS y Rocky Linux 9. En contenedores, WSL y otras versiones, los servicios y paquetes pueden variar. Prepare el acceso de recuperación por consola y compruebe la versión como se explica en crear un entorno de práctica con una máquina virtual.

Criterios para elegir entre cron y temporizador

Criterios cron temporizador de systemd
Unidad de configuración Campo de tiempo y una línea de comando Unidad timer y service
Confirmación de ejecución Salida de trabajo y registro de distribución Estado del servicio y diario
Entorno Entorno limitado diferente del shell de inicio de sesión Entorno de ejecución definido para la unidad
Horario perdido cron normalmente no recupera ejecuciones omitidas Revisión de la configuración de OnCalendar y Persistent

El nombre del demonio cron y si está instalado varía según la distribución. En Ubuntu normalmente se usa cron, en Rocky Linux se usan cronie o crond. El ejemplo de temporizador systemd requiere un entorno donde se ejecute el administrador de systemd del usuario. También se debe distinguir entre el comportamiento del cron común y el de herramientas complementarias como anacron.

Lea primero las expresiones y el entorno de cron

crontab -e edita los trabajos del usuario actual. Los cinco campos de tiempo del crontab del usuario son minuto, hora, día, mes, día de la semana y luego viene el comando. A continuación hay un ejemplo de formato que se ejecuta todos los días a las 02:15, y /home/USER debe reemplazarse con la ruta absoluta real. /etc/crontab es un formato separado donde se agrega un campo de usuario antes del comando.

15 2 * * * /bin/bash /home/USER/bin/job.sh >> /home/USER/job.log 2>&1

El cron no hereda directamente el PATH del terminal, el directorio actual ni las variables de entorno. Use rutas absolutas y establezca el directorio de trabajo dentro del script, y no liste valores secretos directamente en el crontab. Si restringe a la vez el día del mes y el día de la semana, debido a la condición OR de la implementación, puede ejecutarse en días diferentes a los esperados. El tratamiento especial de zonas horarias, horario de verano y el carácter de porcentaje también se debe verificar en el manual de cron que se use.

Crear archivos de servicio de usuario y temporizador

Compruebe que no exista ninguna unidad ni archivo con los dos nombres del ejemplo; si existe, elija otro nombre y cambie todas sus referencias. Ejecute los pasos de creación por separado y deténgase si falla la creación del directorio o de un archivo. El ejemplo escribe la fecha en el diario cada minuto sin privilegios de root. Verifique /usr/bin/date con command -v date y ajuste ExecStart si la ruta difiere.

mkdir -p "$HOME/.config/systemd/user"
cat > "$HOME/.config/systemd/user/linux-course-clock.service" <<'EOF'
[Unit]
Description=Linux course timestamp exercise

[Service]
Type=oneshot
ExecStart=/usr/bin/date --iso-8601=seconds
EOF
cat > "$HOME/.config/systemd/user/linux-course-clock.timer" <<'EOF'
[Unit]
Description=Run the course clock every minute

[Timer]
OnCalendar=*-*-* *:*:00
AccuracySec=1s
Persistent=true

[Install]
WantedBy=timers.target
EOF
systemd-analyze calendar '*-*-* *:*:00'
systemctl --user daemon-reload
systemctl --user enable --now linux-course-clock.timer

Por defecto, el temporizador activa el servicio con el mismo nombre base. OnCalendar define el calendario y AccuracySec permite agrupar activaciones dentro de un margen; no garantiza ejecución en tiempo real. Con Persistent=true, al reactivar el temporizador se intenta recuperar mediante una activación una o más ejecuciones de calendario omitidas; no se repite una vez por cada intervalo perdido.

Verificar la siguiente hora de ejecución y el resultado real de la ejecución

systemctl --user list-timers --all linux-course-clock.timer
systemctl --user status linux-course-clock.timer
journalctl --user -u linux-course-clock.service --since "5 minutes ago" --no-pager
systemctl --user show linux-course-clock.service -p Result -p ExecMainStatus
timedatectl

Después de verificar la próxima hora de ejecución, espere 1-2 minutos y observe la impresión de la fecha y el registro de terminación en el diario. Para los servicios oneshot, incluso si terminan en estado inactivo, pueden haber tenido éxito, por lo que se recomienda comprobar Result y ExecMainStatus. Revise la zona horaria y la sincronización de la hora de timedatectl para asegurarse de que el tiempo local del servidor y la zona horaria deseada coincidan.

Si el trabajo del usuario debe continuar después de cerrar sesión, verifique la duración de vida del administrador de usuario y la política de persistencia (linger). No suponga que habilitarlo significa que se ejecutará después de cerrar sesión o tras reiniciar en todas las condiciones. Al operar con temporizadores del sistema, diseñe por separado una cuenta dedicada, rutas absolutas, privilegios mínimos y limitaciones de recursos.

Gestionar solapamientos, fallos y retirada de la práctica

Si un trabajo cron normal tarda más que su ciclo programado, puede superponerse con la siguiente ejecución, por lo que se recomienda considerar métodos de bloqueo como 'flock' en entornos compatibles. Incluso si un temporizador systemd intenta reactivar la misma unidad de servicio que ya se está ejecutando, no genera automáticamente dos instancias separadas. Sin embargo, puede compartir recursos con otras unidades o ejecuciones manuales, por lo que las condiciones de ejecución simultánea a nivel de aplicación aún son necesarias.

systemctl --user disable --now linux-course-clock.timer
rm -- "$HOME/.config/systemd/user/linux-course-clock.timer" "$HOME/.config/systemd/user/linux-course-clock.service"
systemctl --user daemon-reload
systemctl --user list-timers --all linux-course-clock.timer

La eliminación se limita a los dos archivos creados en esta práctica. Si añadió una línea de cron, elimine únicamente esa línea con crontab -e y compruebe el resultado con crontab -l. Conserve las demás tareas. Una automatización operativa necesita comprobaciones que detecten fallos y ejecuciones omitidas, junto con un procedimiento de recuperación.

Documentación oficial