Los Dæmons crond y atd

Como les va, queridos lectores y miembros de la Comunidad GNU/Linux? Espero que muy bien. Hoy les quiero comentar sobre un par de servicios que nos permiten ejecutar diferentes trabajos ('jobs', segun la jerga) en cierto momento especifico, o cada cierto tiempo.

Este tipo de servicio esta provisto en GNU/Linux (y Unix en general) por algo llamado "Cron", compuesto por un Daemon y utilidades, y por otra parte por el "At" ('at' en ingles significa algo asi como 'a las' [4pm], por eso el nombre), compuesto por un Daemon y *varias* utilidades. Ambos sistemas proveen un cierto nivel de seguridad, mediante archivos que dan o denegan permiso a ciertos usuarios para hacer uso de esta funcionalidad. Cron y At tienen varias diferencias, siendo para mi la principal la de como especificar un momento o intervalo de repeticion. Empecemos por el Cron.

Cron

El Vixie Cron, que es el comunmente provisto por las diferentes distribuciones GNU/Linux, lee los trabajos a ser realizados de archivos denominados 'crontabs' (Tablas de Cron). Hay un crontab general, en /etc/crontab, que tiene un formato diferente a los crontab de cada usuario, que se guardan en el directorio /var/spool/cron/tabs. Cada archivo tendra un nombre que sera el del usuario que creo cada tab. En mi caso, yo tengo en mi servidor un par de archivos en /var/spool/cron/tabs: buanzo y firewall. Veremos despues el contenido de alguno de estos, explicandolo.

La unica diferencia entre /etc/crontab y los crontabs de usuario es que el /etc/crontab agrega un campo adicional donde se especifica bajo que usuario se ejecutaran las tareas, con lo que el root podria ahorrarse el trabajo de editar crontabs individuales y directamente editar un archivo general.

Antes de ver el formato interno de los crontabs, hablemos del Cron Daemon. El Daemon se inicia por root mediante el comando 'cron', generalmente llamado desde algun script de /etc/rc.d. Al iniciarse carga todos los crontabs, y luego espera hasta tener que ejecutar alguna tarea. Tambien se encarga de enviar por eMail la salida de los comandos ejecutados en las tareas, solo si la variable MAILTO (que veremos enseguida) tiene algun valor de usuario destino. Si MAILTO se pone en "" (vacia), entonces no se enviara ningun eMail. Esto es muy util por ejemplo para estar seguros de que los trabajos funcionan bien. Le ponemos cierto valor no vacio, y veremos el reporte en el eMail de dicho usuario. Una vez que todo anda bien, podemos usar MAILTO="" en el crontab. Si no especificamos un valor (incluso vacio) para MAILTO, entonces el eMail se enviara al usuario dueno de dicho crontab, o si es el /etc/crontab, a root. Tambien se puede especificar una direccion de eMail cualquiera.

La utilidad 'crontab' es la que nos permite editar crontabs, sea la nuestra personal, o la de otro usuario (solo si somos root, claro esta). El comando posee 4 opciones que nos permiten Editar ('-e'), Remover ('-r') o Listar ('-l') el crontab del usuario especificado con el '-u USUARIO', o si no usamos esta opcion, el nuestro.

Ejemplos:

  • Para editar nuestro crontab: crontab -e
  • Para editar el crontab del usuario buanzo: crontab -u buanzo -e
  • Para eliminar nuestro crontab: crontab -r
  • Para listar el crontab del usuario skywalker: crontab -u skywalker -l

El listar equivale a hacer 'cat /var/spool/cron/tabs/USUARIO', pero por los permisos de dichos directorios, solo podremos hacerlo como root. Recuerden que el Cron Daemon funciona como root, y entonces tiene privilegios para leer el archivo y 'mostrarselo' al usuario que lo haya solicitado.

Ahora si, veamos un crontab de usuario real, para poder entender mejor el formato:

SHELL=/bin/sh
MAILTO=""
*/10 * * * *       /usr/local/bin/fetchmail

Aca vemos dos variables: SHELL y MAILTO. La primera indica que se debe utilizar el '/bin/sh' para ejecutar el comando de cada tarea. Luego vemos el uso de MAILTO, que en este caso esta vacio, por lo que no se enviara un email de 'reporte'. Hay otras variables que podemos tocar, como HOME, pero no asi LOGNAME. (man 5 crontab para mas datos).

Luego vemos una linea mas extrania: Consta de 6 campos, a saber:

  • 1 - minuto (0 al 59)
  • 2 - hora (0 al 23)
  • 3 - dia (1 al 31)
  • 4 - mes (1 al 12, o nombres)
  • 5 - dia de la semana (0 al 7, 0=7=Domingo, o nombres)
  • 6 - Comando a ejecutar (o script, cualquier cosa ejecutable), se pueden incluir parametros, etc.

El valor '*' indica 'a cualquier [hora/dia/etc]'. Y el */ALGO indica 'ejecutar cada cierto ALGO'. Entonces, en el ejemplo, cada diez minutos ('*/10') de cualquier dia, mes, etc, se ejecutara el /usr/bin/fetchmail.

Hay otros formatos de campo que se pueden utilizar para realizar ciertas cosas, pero los remito a la man page del crontab, seccion 5.

En el caso del /etc/crontab, el campo 6 pasa a ser el usuario con el que ejecutar el comando, que vendra despues, en el campo 7 agregado. Vean SU /etc/crontab, que contiene varias cosas entre las cuales hay algunas tareas bastante interesantes, como las que definen que los scripts almacenados en /etc/cron.{hourly/weekly/daily} se ejecuten cada hora, semana o dia.

Ahora, los archivos allow y deny, que se guardan en /var/spool/cron, son los que manejan que usuarios pueden o no utilizar cron. El mecanismo es asi: si el archivo allow existe, un usuario debe estar alli dentro para que se le de permiso. Si allow NO existe, pero existe el deny, entonces un usuario NO DEBE estar alli dentro para permitirsele la ejecucion. Si no existe ninguno de estos dos archivos, depende de la configuracion del sistema, por ejemplo, solo root o TODOS podran usarlo. Por otra parte, se pueden hacer que el comando crontab pertenezca a cierto grupo, y que los permisos de ejecucion para 'los demas' (ver USERS 135 - Rincon del Guru) sean nulos. Luego, deberemos hacer miembro de ese grupo a cada usuario que querramos darle permiso. Por supuesto, podemos combinar todas las medidas de seguridad que nos parezcan.

At

El At tiene basicamente la misma funcionalidad, solo cambia el formato con el que se especifica un 'momento'. Tiene una sintaxis muy parecida al ingles. Dare ejemplos para que se entienda, pero antes debemos comprender que el At no ejecuta un comando o script, sino una serie de comandos, que At nos solicitara interactivamente. Tambien podemos especificar un script (y NO un binario) para que sea ejecutado, mediante el parametro '-f', que ahora veremos.

Veamos unos ejemplos, para comprender mejor el uso de at:

at midnight - Ejecutara a la medianoche el script que ingresemos interactivamente al ejecutar el comando. Tambien podemos usar noon (mediodia) o teatime (4pm). Por otra parte, podemos agregar today (hoy) o tomorrow (maniana) como sufijo. Ejemplo: at 8:30am tomorrow (8.30 am de maniana).

at 3:15pm - Ejecutara a las 3:15 de la tarde.

at now + 2 days - Ejecutara dentro de dos dias.

at 10am + 1 week - Ejecutara a las 10am dentro de una semana.

at 11pm Jul 22 - Ejecutara a las 23hs del 22 de Julio.

Y usando el parametro '-f', podriamos hacer: at -f ~/algun_script now + 10 minutes (ejecutar el script ~/algun_script dentro de 10 minutos a partir de ahora).

En vez de usar day[s], week[s], tambien podemos usar minute[s], hour[s]. El now indica "AHORA".

Fecha u hora se pueden especificar con los siguientes formatos: HH:MM (hora:minutos), MMDDYY o MM/DD/YY o DD.MM.YY (mes dia anio).

Los diferentes comandos que hacen al paquete AT son:

  • atd - El AT Daemon - Como cron, se debe cargar desde un script de /etc/rc.d
  • at - El at propiamente dicho. Ver los ejemplos.
  • atq - Ver la lista de trabajos ('jobs') pendientes.
  • atrm - Para eliminar un trabajo pendiente de la cola (queue).
  • batch - Como at, pero ejecutara el script cuando el nivel de carga del sistema haya bajado lo suficiente. (default, 0.8).

El atq es el at con el parametro '-l', y el atrm es el at, pero con el parametro '-d'.

El at tambien admite el parametro '-m', que enviara un eMail al usuario una vez realizado el trabajo.

Para permitir o denegar el uso de at podemos hacer lo mismo que con cron, y los archivos Allow y Deny se encuentran en /etc/at.allow y /etc/at.deny, y se respeta el mismo esquema que en Cron.

Sin mas que comentarles, les envio a todos un fuerte abrazo. No duden en enviarme sus consultas o ideas a la seccion Rincon del Guru enviando eMail a linux@tectimes.com, con asunto "Para Rincon del Guru" (o algo asi).