viernes, 1 de enero de 2021

Automatización de tareas en sistemas GNU/Linux

Posted by q3it on viernes, enero 01, 2021 in ,
En cualquier sistema informático se encuentran herramientas que permiten realizar, con cierta periodicidad, determinadas acciones o tareas (algunas de ellas internas del Sistema Operativo, otras definidas por el administrador, e incluso algunas definidas por un usuario con los privilegios adecuados). La necesidad de este tipo de herramientas viene dada, en principio, tanto por el funcionamiento interno del sistema operativo como por la necesidad del administrador de garantizar un aceptable funcionamiento del sistema. 

Posiblemente, el caso más conocido de tarea programada sea la encomendada al sistema antivirus en los equipos. Por defecto, desde la instalación de la aplicación antivirus se suele proponer una revisión del sistema cada semana (por lo tanto, este es un ejemplo de una tarea programada de forma semanal). 

A continuación se exponen algunos escenarios donde la automatización de tareas simplifica y garantiza la ejecución de las mismas: 
  • Es típico que, para un óptimo rendimiento, el responsable del sistema informático deba realizar actividades de gestión periódicas, así como algunas de control del mismo por ejemplo: Revisar diariamente el grado de ocupación de los discos, testear cada 30 minutos la ocupación del procesador y poder generar un aviso en caso de ocupación de más de un 70%. 
  • Desde el ese mismo punto de responsable del sistema, puede resultar interesante definir una tarea que borre de forma periódica los ficheros temporales por ejemplo: El directorio /tmp), así como realizar copias de seguridad cada día de diversos directorios de datos. 
  • También resulta útil y en algunos casos obligado como parte de la propia política de empresa realizar algún tipo de informe mensual sobre el funcionamiento del sistema (sobre todo en caso de servidores). 
  • Por supuesto, el apagado del equipo de forma automática, adecuándose al horario de trabajo, también puede formar parte de las tareas programadas. 
  • Además se pueden proponer otra serie de tareas periódicas desde las necesidades del usuario como un sistema de recordatorios, o la descarga programada de información en horas de poco tráfico. 
En los sistema Debian GNU/Linux (al igual que el resto de distribuciones GNU/Linux) ya se encuentran preconfiguradas ciertas tareas de forma periódica; es decir, el servicio de automatización de tareas ya está funcionando cuando se realiza la instalación del sistema operativo. 

En los entornos GNU/Linux, los programas típicos destinados a la gestión de las tareas automatizadas son dos: at y cron

CRON 
Se trata de unos de los servicios básicos de los sistemas GNU/Linux. De hecho, el demonio cron siempre está arrancado; además, dicho servicio asume, asimismo, que el sistema siempre está en funcionamiento. 

La función básica de cron es la de ejecutar tareas programadas para un determinado momento, y por un usuario con los privilegios necesarios para poder programarlas. 
Ficheros implicados y configuración básica. 

Los ficheros más importantes implicados en el funcionamiento de servicio cron son: 
  • El propio demonio de funcionamiento: crond 
  • El fichero de configuración (disponible para root): /etc/crontab 
  • El fichero de inicio y parada del demonio: /etc/init.d/cron 
  • La orden para la programación de tareas (disponible para los usuarios con suficientes privilegios): crontab 
  • El sistema de informes (logs) típico de los sistemas GNU/Linux: /var/log/cron 
Como se observa, la configuración del funcionamiento de cron, como ya es típico, se encuentra dentro del directorio /etc. Para, poder arrancar o parar el demonio cron se deberían ejecutar las órdenes correspondientes: 
  • Parada del demonio cron: # /etc/init.d/cron stop 
  • Arranque del demonio cron: # /etc/init.d/cron start
Para entender cómo se deben programar las tareas para que sean ejecutadas, es necesario entender el formato del fichero de configuración (/etc/crontab). Este fichero está estructurado por líneas, cada una de las cuales contiene una tarea programada, según el siguiente formato:

# minuto hora dia mes dia_semana usuario orden_a_ejecutar 

Evidentemente, cada uno de estos campos tiene un rango de utilización, dependiendo de su naturaleza: 
  • El campo minuto puede ser definido entre [0-59]
  • El campo hora puede ser definido entre [00-23]
  • El día del mes, entre [1-31]
  • El mes del año, entre los valores [1-12]
  • El día de la semana, entre [0-7], asumiendo el 0 como inicio de la semana en domingo, y el valor 7 también como domingo (el 1 será el lunes, 2 martes...).
  • El campo usuario es aquel usuario del sistema con permisos que ha definido la tarea programada.
  • Por último, se indica la orden (o el script) que se ejecutará. 
Además, existen símbolos especiales para los cinco primeros campos, que indicarían aspectos genéricos (no un número concreto): 

* : indica cualquier valor.
, : actúa como separador de una lista de valores. 
# : indica que lo que acompaña es un comentario (no se ejecutará). 
- : sirve para indicar un rango de valores.
/ : sirve para indicar un paso de valor (por ejemplo, en el campo mes si se indica */3 se está detallando que la tarea se realizará cada tres meses). 

Una vez vista su sintaxis, si se deseara ejecutar que se apague la computadora a las 17 horas, todos los días laborables, se escribiría en el fichero de configuración la línea: 

0 17 * * 1-5 shutdown -h now

Además, en los cinco primeros campos se puede optar por los siguientes cadenas:

@reboot: Se ejecuta al iniciarse la máquina.
@yearly: Se ejecuta una vez al año.
@monthly: Se ejecuta una vez al mes.
@weekly: Se ejecuta una vez por semana.
@daily: Se ejecuta una vez al día.
@hourly: Se ejecuta una vez por hora.

Y, por último, también es interesante conocer que cada una de las tareas programadas se ejecutan mediante un shell (/bin/sh), y que están disponibles algunas variables de entorno, como pueden ser LOGNAME, SHELL o NAME.

CONTRAB
La orden crontab es la responsable de la planificación del servicio, y lo que hace es gestionar los ficheros crontabs asignados a cada usuario (en /var/spool/cron/crontabs/). Es decir, cada usuario (con los permisos adecuados) puede gestionar sus propias planificaciones de tareas.

Su sintaxis consiste en la orden crontab seguida del fichero, y de forma opcional, algunos parámetros:

crontab [-l e r u] fichero

Respecto a los parámetros, su significado es el siguiente:
  • l : muestra el fichero de configuración del usuario.
  • e: edita el fichero de configuración del usuario.
  • r: borra el fichero de configuración del usuario.
  • u usuario: especifica el usuario propietario de la tarea (normalmente, esta opción la usa el usuario root para cambiar propietarios de tareas).
De este modo, un usuario con permisos (normalmente pasan por pertenecer al grupo de usuarios crontab) podría generar un fichero con el formato adecuado para que se programasen sus tareas. Un ejemplo sencillo de cómo programar las tareas sería:

1.- Ejecutar la carga del fichero de planificación
$ crontab -e

2.- Generar un fichero de nombre ejemplo.txt de una línea (recordar que se ejecutan las tareas por líneas mediante un shell) con el contenido:
30 10 14 04 2 date >> ejemplo.txt

3.- Para estar seguro que se ha añadido a la lista de tareas, mirar la lista de las mismas:
$ crontab -l

Donde debería devolver el contenido del fichero ejemplo.txt (el dia 14 de abril a las 11:30 con la hora y la fecha exacta).

Una vez acabadas las pruebas, se puede eliminar la carga de tareas mediante crontab con la opción -r.

Para tener permiso y poder utilizar la orden, se deben tener presentes los siguientes ficheros:
  • /etc/cron.allow: Si existe, sólo los usuarios listados en este fichero tienen permiso para ejecutar la utilidad (uno por línea).
  • /etc/cron.deny: Si existe este fichero, y no el anterior, los usuarios detallados en él no pueden ejecutar crontab.
Anacron
Hasta ahora, se ha mostrado cómo trabaja cron, pero se ha asumido que el sistema siempre está funcionando. Evidentemente, esto puede ser cierto para algunas máquinas (por ejemplo, ciertos servidores), pero no para todas (no todos los sistemas están en funcionamiento las 24 horas). Por ello, existe un programador de tareas (acompañando a cron) que no requiere del funcionamiento constante del sistema, anacron.

Este planificador se inicia junto con el sistema, y revisa cuáles son las tareas programadas que no se han llevado a cabo y las realiza. Habitualmente, suelen ser las tareas que se instalan en los directorios del tipo /etc/cron.* (daily, hourly...).

Cuando arranca anacron, revisa qué tareas programadas no se ha realizado y las lleva a cabo.

Como es predecible, la instalación de dicho servicio (aunque es estándar en los sistemas Debian GNU/Linux) se realizaría mediante la orden:

# apt-get install anacron

AT
Como se ha comentado, el servicio ofertado por cron se ejecuta de forma periódica, de modo que las tareas programadas siempre serán realizadas siguiendo los criterios de temporalización programados.

A diferencia de cron, las tareas que son encomendadas a at (y su demonio atd) sólo se realizarán una vez. Es decir, la utilidad at se utiliza para programar una tarea que se llevará a cabo en un momento determinado, y no se volverá a ejecutar.

Las utilidades que se pueden encontrar directamente relacionadas con at son:
  • at: orden que se utiliza para añadir nuevas tareas.
  • atd: es el demonio responsable de ejecutar las tareas programadas desde at.
  • atq: muestra la lista de tareas pendientes a ejecutar (por el usuario que llama al comando).
  • atrm: elimina una tarea de la lista de pendientes.
Ficheros implicados y utilización

Al igual que en el caso de cron, los ficheros relacionados con at son:
  • /etc/at.allow: Si existe, sólo los usuarios listados en este fichero tienen permiso para ejecutar la utilidad.
  • /etc/at.deny: Si existe este fichero, y no el anterior, los usuarios detallados en él no pueden ejecutar at (ni atrm, ni atq).
  • Si no existiesen ninguno de los anteriores ficheros, sólo el usuario root puede disponer de la utilidad at.
Normalmente, después de la instalación se dispone del fichero /etc/at.deny, aunque vacío, de modo que todos los usuarios tienen acceso a la orden at.

Para conocer el funcionamiento de at, como ya es típico en los sistema GNU/Linux, se puede acudir a la ayuda (man) de la orden ejecutando:

$man at

No obstante, su utilización es bastante simple. La sintaxis que se utiliza es la orden (at) seguido de los parámetros:

  • HH[:]MM[am|pm] [Mes día].
  • Se puede añadir a la fecha/hora un número (seguido de minutes,hours,days,weeks).
  • También se pueden añadir valores relativos como now, midnight, noon, teatime, today o tomorrow.
A continuación algunos ejemplos de utilización:

$ at 10am tomorrow
$ at 10am Jun 30
$ at 1730 Feb 28 + 3 days

Para que ejecute en el momento programado -las 12 AM del día siguiente- un script preparado por el usuario, se debe indicar del siguiente modo:

$at 12am 04/14/2020 < copia.sh

El cometido del script puede ser, por ejemplo, una copia del archivo de configuración de sesiones (Xsession) de la máquina, con el siguiente contenido:

#!/bin/sh
#Copia del fichero /etc/X11/Xsession al escritorio del usuario
cp -f /etc/X11/Xsession $HOME/Desktop
exit 0


El resultado del script es el siguiente:

Como se ve en la figura se creó un archivo llamado Desktop y dentro de él están los parámetros de sesión del sistema. 

UTILIDADES GRÁFICAS
Lo descrito anteriormente debe ser conocido por el responsable de la automatización de las tareas. No obstante, existen algunas utilidades en entorno gráfico que facilitan la utilización y gestión de las tareas programadas en el sistema.

Posiblemente la más utilizada (por ser independiente del escritorio -KDE,GNOME- o gestor de ventanas instalado) de forma histórica en sistemas servidores sea Webmin [http://www.webmin.com/], mediante el módulo de sistema dedicado a la automatización. 

Una vez instalado webmin, así como los comandos at y cron, se puede acceder a la utilidad gráfica de Webmin desde un navegador web, dirigiéndose a la dirección http://localhost:10000 (o https, dependiendo del tipo de instalación), y dirigiéndose a la entrada Webmin->Sistema->Comandos planificados (Scheduled Commands, Scheduled Cron Jobs).

Para utilizar esta herramienta hay que instalarla en nuestro sistema, desde la pagina webmin.com descargaremos un archivo .deb le damos permisos de ejecución y procedemos a instalarlo. Una vez hecho esto abrimos una página del navegador y ponemos en la URL localhost:10000 nos saldrá un panel de usuario para logue (ponemos nuestro usuario y pass de Ubuntu).

Luego de loguearnos nos envía a la interfaz gráfica de la aplicación donde se puede administrar el sistema vía web.

En el Dashboard/ System podemos configurar tareas predefinidas por Webmin o crear una nueva.

Y algo particular, es que me trae del sistema las tareas que le había definido con CRON en la Shell.

Si lo que queremos es crear una nueva tarea le damos a la pestaña crear una nueva tarea de cron en catálogo.

Una vez dentro le damos los parámetros que quisiéramos para nuestra nueva tarea, como se ve en la siguiente figura.

Algo muy importante que puntualizar con esta herramienta es que engloba todo lo analizado en los temas anteriores: Sistemas, procesos, usuarios, carpetas compartidas, etc. Con ella podemos manipular la información de forma gráfica.