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.



