LPIC-1 Tema 107.2: gestión y programación de tareas

Siguiente entrada del blog sobre las certificaciones LPIC-1, en esta ocasión sobre el tema 107.2, dentro del bloque temático de administración de tareas. Concretamente, en este tema se necesita que el administrador sepa cómo automatizar algunas tareas para que se ejecuten cuando se requiere e incluso con una determinada frecuencia.

Los candidatos se enfrentará a algunas pregunta sobre el uso sobre cron para programar tareas, conocer crontab, así como at, etc. Por supuesto, también debe conocer las novedades que aporta en este sentido systemd y sus unidades temporales.

cron vs anacron

Lo primero es diferenciar entre cron y anacron.

  • cron: es un demonio o servicio que permite ejecutar tareas, procesos, programas o scripts en segundo plano y de forma automática. Además lo hace de forma periódica en fecha y hora especificada. Resulta ideal para servidores o equipos que no se apagan, ya que si se apaga y llega el momento de ejecutar una tarea no se va a ejecutar. Cada minuto cron consultará las siguientes ubicaciones en busca de tareas que ejecutar:
    • /etc/crontab
    • /etc/spool/cron/crontabs/*.*
    • /etc/cron.d
    • /etc/cron.hourly
    • /etc/cron.daily
    • /etc/cron.weekly
    • /etc/cron.monthly
  • anacron: no estará constantemente corriendo en segundo plano (no es un demonio), sino que es un programa que se lanza en el arranque y ejecutará las tareas de forma asíncrona. Muy bueno para ejecutar tareas que quedaron pendientes de realizar en aquellos equipos que permanecen algún tiempo apagados, como los PCs. Por eso es un buen complemento de cron, pero no una alternativa (de hecho se ejecuta a través de llamadas de cron, scripts,…). En este caso buscará en:
    • /etc/anacrontab
    • /etc/cron.daily
    • /etc/hourly
    • /etc/monthly

En algunas distros, anacron no estará instalado de forma predeterminada.

Ficheros importantes de Linux

Los ficheros y directorios que deberías conocer a fondo son:

/etc/crontab

Este fichero no es recomendable editarlo. Se debería guardar como referencia y usar los siguientes para programar tareas. Con este fichero se llama a anacron y para configurar la ejecución de scripts almacenados en los siguientes directorios.

Una línea de este fichero tiene el siguiente formato:

mi    ho    dm    me    ds    usuario    comando/programa a ejecutar

Siendo estos campos lo siguiente:

  • mi: minutos de (0-59) en el que se ejecuta la tarea. En caso de no especificarse aparecerá un *. Además, podrías usar rangos separando valores con – (p.e.: 1-10) y múltiples valores (p.e.: 2,4,8).
  • ho: hora del día (0-23).
  • dm: el día del mes (1-31).
  • me: mes del año (1-12).
  • ds: día de la semana (0-7). El domingo puede ser tanto el 0 como el 7. Se puede usar también las siglas de los días en inglés (mon, thu, wen, fri, sat, sun).
  • usuario: al que pertenece dicha tarea.
  • comando/programa: apunta al comando o binario que se necesita ejecutar.

Por ejemplo:

  • 01 * * * *    Se ejecuta el primer minuto de cada hora de todos los días.
  • 50 8 * * *    Se ejecuta a las 8:50 de cada día.
  • 00 20 * * 0    Se ejecuta a las 20:00 todos los domingos.
  • *  5 * * Sun    Se ejecuta cada minuto de entre las 5:00 a.m. y las 5:59 a.m. todos los domingos.
  • 00 19 1 * *    Se ejecuta a las 19:00 el primer día de cada mes.
  • 20 * * 1 6    Al minuto 20 de cada hora de los sábados de enero.

En el momento especificado en este fichero se irán ejecutando los scripts o tareas que se encuentran en los siguientes directorios…

/etc/cron.{d,hourly,daily,monthly}/

En Linux, cron y anacron (si se encuentra presente) actuarán ejecutando las tareas de esta forma según donde se encuentren:

  • /etc/cron.hourly/: se ejecutan en cada hora, es decir, durante un día se habrán ejecutado estas tareas 24 veces si la máquina permanece encendida.
  • /etc/cron.daily/: los scripts ubicados dentro de este directorio se ejecutan una vez al día a la hora especificada en /etc/crontab. Si está presente anacron, los scripts presentes que hace más de un día que se ejecutaron también se ejecutarán según el momento especificado en /etc/anacrontab.
  • /etc/cron.monthly/: igual al anterior, solo que en vez de hacerse diariamente se hará mensualmente.
  • /etc/cron.weekly/: en algunas distro también encontrarás este otro, igual que los anteriores pero para tareas que se deben ejecutar semanalmente.
  • /etc/cron.d/: está soportado en algunas distribuciones y permite

/etc/anacrontab

Si está anacron presente en el sistema, entonces cron ejecutará las tareas en el momento especificado en este fichero. Es el equivalente de crontab para anacron. En este caso, la línea será ligeramente diferente:

periodo    retardo   id   comando

Siendo:

  • periodo: es la frecuencia en días con la que quieres ejecutar la tarea. Puedes usar 1 o @daily para que se ejecute diariamente. O se puede usar 7 o @weekly para que sea semanal, e incluso 30 o @monthly para que se haga mensualmente. Puedes usar también otras cifras intermedias, por ejemplo, 2 para que se haga cada dos días.
  • retraso: número entero en minutos que transcurren desde que anacron detecta que hay que ejecutar un comando o script hasta que se ejecuta. Eso evita sobrecargas de CPU y memoria si se tienen que realizar varias tareas simultáneas.
  • identificador: un nombre cualquiera con el que puedes identificar tu tarea. Puede ser útil para que se registre en los logs y poder identificarlo.
  • comando: es el programa o script a ejecutar.

Por ejemplo:

7   10   copia_seguridad    /bin/bash /home/isaac/scripts/backup.sh

A los 7 días, o en el momento que se encienda el equipo si se detecta que lleva más de 7 días sin hacerse, se hará una copia de seguridad usando ese script. Se ha configurado un retraso de 10 min tras el que comenzará a realizar la copia.

/etc/cron.deny y /etc/cron.allow

En estos ficheros habrá una lista de usuarios a los que se le niega el uso de cron y a los que se le permite respectivamente. Es decir, si están en .deny se le deniega el uso, y si optamos por incluir usuarios en .allow solo se le permitiría a los que estén listados en él.

Cada nombre de usuario se escribirá en una línea. O se puede usar ALL como comodín para especificarlos a todos.

/etc/at.deny y /etc/at.allow

Es similar al anterior, pero para determinar los usuarios que no pueden o pueden enviar tareas con at o batch…

/var/spool/cron/

Cada usuario del sistema podrá programar sus propias tareas específicas. Aquí es donde se almacenan.

/var/spool/anacron/

Cuando se pone en funcionamiento anacron, y una vez se realiza la tarea, se guarda un registro con la fecha de ejecución en esta ubicación.

Herramientas que debes conocer para programar tareas

En cuanto a las herramientas que tienes a tu alcance para programar las tareas, debes conocer las siguientes…

crontab

Para poder programar una tarea  se puede usar este comando:

#Para el usuario con el que estamos logeados
crontab -e

#Otro usuario
crontab -u usuario1 -e

#Listar entradas progarmadas
crontab -l

#Eliminar los trabajos programados para mi usuario
crontab -r

Se abrirá un editor para poder escribir las líneas con el momento y tarea que quieres programar. Por ejemplo:

0 09 1,15,30 * * /home/isaac/scripts/prueba.sh

Esta línea ejecutaría todos los días 1, 15 y 30 de cada mes a las 9 de la mañana el script llamado prueba.sh.

anacron

Este comando te ayuda a ejecutar comandos o scripts de forma periódica. Por ejemplo:

#Forzar la ejecución de las tareas ignorando los timestamps o configuración de anacrontab
anacron -f

#Más información
man anacron

at, atq, atrm

Existe también at, que es un comando con el que poder programar tareas para que se ejecuten una sola vez, sin periodicidad como las anteriores.

También existe batch, pero no es importante para las LPIC.

Esta herramienta es interactiva, por lo que cuando la ejecutes te aparecerá un prompt en el que poder ir introduciendo los comandos o script a ejecutar. Una vez terminas, pulsas INTRO para pasar a una nueva línea si quieres introducir varios comandos, y Ctrl+D en una nueva línea para que la tarea se agregue a la cola.

#Iniciar el prompt interactivo para que se ejecute la tarea en este momento especificado
at now + 10 years

#Ver las tareas que hay programadas
atq

#Eliminar una tarea especifica programada especificando su job ID
atrm 4

Para especificar cuándo se debe ejecutar la tarea o tareas, puedes usar los siguientes modificadores temporales:

  • noon    A las 12:00 pm
  • midnight   A las 00:00
  • tomorrow   Mañana
  • next week  La semana que viene
  • next monday  El lunes siguiente
  • fri  El viernes
  • 9:00 AM  A las 9:00
  • 7:00 PM   A las 19:00
  • now   Ahora
  • now + 30 minutes   En media hora
  • now + 2 days  En dos días a partir de ahora
  • now + 1 years  En un año a partir de ahora

Por supuesto existen más, como mon, sun, etc., para días de la semana, nov, jan, oct, etc., para meses concretos, weeks y months para semanas y meses, así como la posibilidad de combinar varios de ellos.

Con systemd

Con la llegada de systemd también se ha dotado a los administradores de sistemas de alternativas a las herramientas anteriores para programar tareas. Para ello puedes usar los llamados Timers de systemd.

Systemd Timer Units tiene sus ventajas y desventajas con respecto a lo anterior, ya que existen algunas diferencias. Una de las mayores limitaciones o carencias se debe a que estas Timer units son servicios de systemd. Por tanto, se registrarán en el log de systemd, se pueden activar por eventos como cambios de arranque o en el hardware, uso de tiempo real o monotónico.

La ventaja de cron es que es más simple y que es capaz de enviar correos electrónicos usando MAILTO.

Bien, dicho esto, para programar una tarea como un script a ejecutar con systemd, lo primero será crear el Service Unit File. Para ello puedes crear un fichero llamado miscript.service en la ubicación /etc/systemd/system/:

[Unit]
Description="Mi script hará una copia de seguridad diaria"
 
[Service]
ExecStart=/usr/local/bin/backup.sh

Como ves, el script backup.sh que se ejecutará está ubicado en esa ruta especificada, pero puedes usar otra…

El siguiente paso es crear un Timer Unit File. Deberá tener el mismo nombre que el anterior, pero con extensión .timer y estar ubicado en /etc/systemd/system/. En este caso sería miscript.timer y cuyo contenido debería ser:

[Unit]
Description="Copia de seguridad"
 
[Timer]
OnBootSec=3min
OnUnitActiveSec=24h
Unit=backup.service
 
[Install]
WantedBy=multi-user.target

Como ves se especifica una descripción, el tiempo que se esperará para ejecutarlo tras el arranque (OnBootSec), el tiempo relativo a la última vez que se activó la unidad (OnUnitActive) y el target (WantedBy).

Ahora puedes comprobar si la sintaxis es correcta:

sudo systemd-analyze verify /etc/systemd/system/miscript.*

Después habrá que iniciar el Timer y lo añadimos al arranque:

sudo systemctl start miscript.timer
sudo systemctl enable miscript.timer

Podrás ver su estado y ver registros con:

systemctl status miscript.timer
sudo journalctl -u miscript

Incluso puedes arrancar de forma manual la tarea si lo quieres:

sudo systemctl start miscript.timer

También deberías conocer la herramienta systemd-run

Isaac

Apasionado de la computación y la tecnología en general. Siempre intentando desaprender para apreHender.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto:

Si continuas utilizando este sitio aceptas el uso de cookies. más información

Los ajustes de cookies de esta web están configurados para "permitir cookies" y así ofrecerte la mejor experiencia de navegación posible. Si sigues utilizando esta web sin cambiar tus ajustes de cookies o haces clic en "Aceptar" estarás dando tu consentimiento a esto.

Cerrar