#4sysadmins

Inicio » GNU/Linux » Usar anacron para programar tareas de usuario

Usar anacron para programar tareas de usuario

Últimas Entradas

Follow #4sysadmins on WordPress.com

Cuando se programa una tarea acostumbramos a hacerlo mediante crontab:

$ sudo crontab -u <usuario> -e

Y en el archivo que se despliega añadimos la línea de ejecución de la tarea, por ejemplo:

00 07 * * * /comando/a/ejecutar

Pero… ¿ Que pasa si no tenemos el ordenador encendido a las 07:00 am ? pues como es lógico la tarea  no se ejecutará.


 

Sobre anacron

Cuando estamos configurando la ejecución de una tarea para equipos personales (que a diferencia de servidores, estos suelen apagarse con mas frecuencia) lo recomendable es usar anacron en vez de crontab. anacron está diseñado para que al iniciarse, lea su archivo de configuración y ejecute aquellas tareas que necesiten ejecutarse. Para esto anacron utiliza un archivo que contiene la fecha de última ejecución, por ejemplo /var/spool/anacron/cron.daily para aquellas tareas que necesiten ser ejecutadas diariamente. La próxima vez que se inicie el demonio anacron (bien manualmente o al reiniciar el sistema), anacron comprobará la fecha y para este caso, si existe mas de 24h de desfase entre la fecha almacenada en el archivo y la actual, anacron ejecutará las tareas, de lo contrario, no hará nada.

Entonces, si tenemos una tarea programada para que se ejecute todos los días pero el ordenador lleva apagado mas de un día, cuando volvamos a encender el sistema o ejecutemos el demonio, anacron detectará que la tarea ya debería de haberse ejecutado, por lo que entonces anacron la ejecutará.

Nota: Si por cualquier motivo queremos que si se ejecuten las tareas de anacron aun sin haber pasado las 24h, podremos modificar la fecha del histórico y atrasarla un día, de esta manera si volvemos a reiniciar el sistema o el demonio, las tareas programadas serán ejecutadas.
 

Como configurar anacron

El programa anacron se configura a través del archivo /etc/anacrontab y seguramente tenga un contenido parecido a este:

# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root
# These replace cron's entries
1 5 cron.daily run-parts --report /etc/cron.daily
7 10 cron.weekly run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly run-parts --report /etc/cron.monthly

En este archivo de configuración existen tres líneas con el siguiente formato:

periodo retraso identificador-de-trabajo comando
  • El campo periodo indica cada cuanto tiempo deben de haberse ejecutado las tareas, por ejemplo 1 para cada día
  • Retraso indica después de cuantos minutos a partir de que el demonio anacron se haya iniciado, serán ejecutadas las tareas, por ejemplo 15 minutos después
  • El identificador sirve para concretar un poco sobre la tarea a realizar por el comando. cron.weekly tareas que deben de ejecutarse cada siete días.
  • comando que será ejecutado. Se le pueden pasar opciones y parámetros. run-parts –report /etc/cron.daily

Cogiendo cualquiera de las líneas de ejemplos anteriores, sabríamos que:

Cada 7 días deben de ejecutarse los programas que se encuentren dentro del directorio /etc/cron.weekly. El comando run-parts lo que hace básicamente es ejecutar todos aquellos archivos binarios y ejecutables que se encuentren dentro de un cierto directorio pasado como parámetro. Además en estos ejemplos se le ha pasado la opción –report que lo que hará es mostrar el nombre de los scripts que generan una salida (ya sea por stdout o stderr). Importante saber que este comando (run-parts) para esta línea de ejemplo será ejecutado pasados 10 minutos desde que el sistema fue iniciado o mas concretamente el demonio anacron.
 

¿ Como hacemos entonces para que nuestra tarea se ejecute cada día ?

Pues podremos o bien definir una nueva línea en el archivo de configuración de anacron, o en este caso aprovechar que ya existe una tarea que ejecuta todos los binarios o scripts que se encuentran dentro de /etc/cron.daily (significando esto que son programas que debería de ejecutarse a diario), por lo que bastará con pegar una copia de nuestro programa dentro de este directorio.

Una pregunta que podemos hacernos (o que al menos yo me hice ante el desconocimiento) es la siguiente:

Si anacron se ejecuta cuando se inicia el sistema y mi sistema se encuentra encendido mas de 24 horas, ¿Como es posible que esa tarea que debería de ejecutarse a diario sea ejecutada si no existe tarea cron específica ya que la ha sustituido anacron?

Tirando del hilo y preguntando a man, encontré que para Debian cron ejecuta también (a parte de las líneas de crontab) aquellas que se encuentran grabadas en los archivo bajo /etc/cron.d y para nuestro caso existe el archivo /etc/cron.d/anacron que contiene la siguiente línea:

30 7 * * * root start -q anacron || :

Por lo que si el sistema no se a apagado, anacron será ejecutado mediante cron todos los días a las 07:30 AM. Con esto, nuestra tarea diaria será ejecutada.

De no existir este archivo o encontrarnos bajo sistemas RPM podríamos meter esa misma línea en crontab.
 

¿ Como sabe anacron si una tarea que debería de ejecutarse todos los días no ha sido ya ejecutada?

Para conocer esto, anacron se basa en un timestamp guardado en cada uno de los respectivos archivos referenciados por el identificador de la tarea configurada en anacron y que se almacenan bajo /var/spool/anacron. Por ejemplo, para la tarea cron.daily de la línea de ejemplo anterior, el archivo que guarda su timestamp será:

/var/spool/anacron/cron.daily

 

Como ejecutar anacron

Por regla general anacron suele ejecutarse al iniciar el sistema. Podemos verificar esto siguiendo el rastro de los programas que se ejecutan en nuestro runlevel (esto variará en función del sistema de inicialización que use nuestra distribución). No obstante las tres formas mas comunes de ejecutar anacron son:

  • Hacer que anacron ejecute las tareas programadas de forma secuencial:
$ sudo anacron -s
  • Ejecutar las tareas sin tener en cuenta el timestamp:
$ sudo anacron -f
  • Si queremos ejecutar las tareas sin tener en cuenta el tiempo de retraso configurado en /etc/anacrontab:
$ sudo anacron -n

 


 

¿ Quieres que una tarea sea ejecutada con un determinado usuario a través de anacron?

Lo normal es que sea root quien ejecute la tarea programada en anacron pero podemos hacer que de root pase al usuario que necesitemos. Yo voy a dar aquí dos posibles soluciones.

1 . Crear un script con la siguiente línea y, o bien lo copiamos y pegamos dentro de alguno de los directorios ya definidos en /etc/anacrontab, o crear una nueva línea de ejecución dentro del archivo /etc/anacrontab que apunte a este script:

#!/bin/bash
# Ejecutar nuestro programa con el usuario nebul4ck
su - nebul4ck -c "/ruta/al/programa"

De esta manera root ejecutará mediante anacron este script y este script ejecutará nuestro programa con nuestro usuario.

2 . Dar el permiso SUID a nuestro programa:

Cuando tengamos copiado nuestro programa a alguno de los directorios /etc/cron.daily, /etc/cron.weekly…, a menos que no estemos referenciando a nuestro programa directamente desde la línea del archivo /etc/anacrontab, para ambos casos nuestro programa tendrá que tener como propietario a nuestro usuario y a continuación setearemos el bit SUID:

$ sudo chmod +4000 <nuestroprograma>

Aviso: Esto puede crear problemas de seguridad en nuestro sistema.

 


Deja un comentario, Gracias!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: