Programación de tareas con at, cron y temporizadores de systemd

LinuxBeginner
Practicar Ahora

Introducción

Los administradores de Linux programan tareas de diversas maneras. El comando at programa tareas de ejecución única, cron programa tareas recurrentes mediante campos de tiempo sencillos, y los temporizadores de systemd programan servicios de systemd utilizando el modelo de dependencias y registro de systemd.

En este laboratorio, creará un script de comandos y lo programará de tres formas distintas. Inspeccionará los servicios del programador, pondrá en cola una tarea única con at, configurará un archivo de cron, creará un par de servicio y temporizador de systemd, y probará manualmente el servicio asociado al temporizador.

Inspeccionar los programadores y crear un script de tareas

En este paso, confirmará que los servicios de programación están en ejecución y creará un pequeño script que será invocado por todas las tareas programadas.

Acceda al directorio del proyecto.

cd /home/labex/project

Compruebe el demonio de tareas únicas y el demonio de cron. systemctl is-active devuelve active cuando un servicio se está ejecutando actualmente.

systemctl is-active atd crond

Enumere los temporizadores de systemd existentes. La salida muestra la próxima hora de ejecución, la unidad de temporizador y la unidad de servicio que activa.

systemctl list-timers --all --no-pager | sed -n '1,10p'

Cree un script que añada una línea con marca de tiempo a un archivo de registro. El primer argumento, $1, se convierte en la etiqueta que identifica qué programador ejecutó el script.

cat > /home/labex/project/scheduled-note.sh <<'EOF'
#!/bin/bash
echo "$(date '+%F %T') $1" >> /home/labex/project/schedule-events.log
EOF

Haga que el script sea ejecutable.

chmod 755 /home/labex/project/scheduled-note.sh

Ejecute el script manualmente una vez.

/home/labex/project/scheduled-note.sh manual-run
tail -n 1 /home/labex/project/schedule-events.log

La línea del registro debería terminar con manual-run.

Poner en cola una tarea única con at

En este paso, programará una tarea de ejecución única con at. Esto es útil para trabajos que deben realizarse una sola vez en el futuro, como una tarea de mantenimiento temporal.

Ponga en cola el script para que se ejecute dentro de dos horas. El comando a ejecutar se envía mediante una tubería a at.

echo "/home/labex/project/scheduled-note.sh at-job" | at now + 2 hours

Enumere las tareas en cola.

atq

Guarde el ID de la tarea de la primera línea de atq. El ID de la tarea es el primer campo de la salida.

job_id="$(atq | awk 'NR==1 {print $1}')"
echo "$job_id" > /home/labex/project/at-job.id
cat /home/labex/project/at-job.id

Inspeccione el contenido de la tarea en cola. at -c muestra el script de la tarea generado; las últimas líneas deben incluir el comando que puso en cola.

at -c "$job_id" | tail -n 12

Configurar un archivo de cron

En este paso, configurará una tarea de cron recurrente mediante un archivo en /etc/cron.d. Los archivos en este directorio incluyen un campo de usuario, por lo que el sistema sabe qué cuenta debe ejecutar el comando.

Cree un archivo de cron que ejecute el script cada minuto como usuario labex. La línea PATH proporciona a cron una ruta de búsqueda de comandos predecible.

sudo tee /etc/cron.d/rhcsa-schedule-demo >/dev/null <<'EOF'
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
* * * * * labex /home/labex/project/scheduled-note.sh cron-job
EOF

Establezca el modo del archivo en 644. Los archivos de cron deben ser legibles y no deben ser modificables por usuarios comunes.

sudo chmod 644 /etc/cron.d/rhcsa-schedule-demo

Recargue crond para que detecte el archivo inmediatamente.

sudo systemctl reload crond

Inspeccione el archivo que creó.

sudo cat /etc/cron.d/rhcsa-schedule-demo

Los campos de programación * * * * * significan cada minuto.

Crear un servicio y un temporizador de systemd

En este paso, creará un servicio de systemd y un temporizador que lo active. Un temporizador no ejecuta un comando directamente; inicia una unidad de servicio.

Los servicios del sistema deben ejecutar comandos desde rutas ejecutables del sistema, no desde el directorio de trabajo de un usuario. Instale una copia de su script en /usr/local/bin.

sudo install -m 755 /home/labex/project/scheduled-note.sh /usr/local/bin/rhcsa-scheduled-note
sudo restorecon /usr/local/bin/rhcsa-scheduled-note 2>/dev/null || true
ls -l /usr/local/bin/rhcsa-scheduled-note

Cree la unidad de servicio. Type=oneshot es apropiado para un comando que se ejecuta y termina.

sudo tee /etc/systemd/system/rhcsa-schedule-demo.service >/dev/null <<'EOF'
[Unit]
Description=Write RHCSA schedule demo entry

[Service]
Type=oneshot
User=labex
ExecStart=/usr/local/bin/rhcsa-scheduled-note timer-job
EOF

Cree la unidad de temporizador. OnBootSec=2min programa una primera ejecución después del arranque, y OnUnitActiveSec=5min programa ejecuciones posteriores relativas a la activación anterior.

sudo tee /etc/systemd/system/rhcsa-schedule-demo.timer >/dev/null <<'EOF'
[Unit]
Description=Run RHCSA schedule demo periodically

[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
Unit=rhcsa-schedule-demo.service

[Install]
WantedBy=timers.target
EOF

Recargue systemd, habilite el temporizador para el arranque e inícielo ahora. Separar enable y start aclara qué comando hace que el temporizador sea persistente y cuál lo activa inmediatamente.

sudo systemctl daemon-reload
sudo systemctl enable rhcsa-schedule-demo.timer
sudo systemctl start rhcsa-schedule-demo.timer

Inspeccione el temporizador.

systemctl list-timers rhcsa-schedule-demo.timer --all --no-pager

El temporizador debería aparecer en la lista y debería activar rhcsa-schedule-demo.service.

Probar el servicio del temporizador y eliminar la tarea de at

En este paso, iniciará manualmente el servicio utilizado por el temporizador. Esto verifica el comando inmediatamente sin esperar a la siguiente activación programada. También eliminará la tarea de at en cola, ya que era solo para fines de práctica.

Inicie el servicio manualmente.

sudo systemctl start rhcsa-schedule-demo.service

Inspeccione el registro.

tail -n 5 /home/labex/project/schedule-events.log

Una línea debería terminar con timer-job.

Elimine la tarea de at en cola utilizando el ID de tarea guardado anteriormente.

job_id="$(cat /home/labex/project/at-job.id)"
atrm "$job_id"

Confirme que la tarea ya no está en cola.

atq

Resumen

Ha practicado tres métodos de programación. Inspeccionó atd, crond y los temporizadores de systemd, creó un script de comandos programables reutilizables, puso en cola e inspeccionó una tarea única de at, configuró un archivo de cron recurrente, instaló un comando seguro para el sistema en /usr/local/bin, creó un par de servicio y temporizador de systemd, probó manualmente el servicio del temporizador y eliminó la tarea temporal de at.