Gentoo Logo

Guía Gentoo Linux de Cron

Contenido:

1.  Aspectos básicos de cron

¿Qué hace cron?

Cron es un demonio que ejecuta tareas de manera programada basado en la configuración del comando crontab. Cumple esta tarea al despertar cada minuto y revisando la existencia de trabajos-cron en los crontabs de los usuarios.

Nota: Note que crontab es a la vez, el nombre de la lista de trabajos-cron al igual que el nombre del comando usado para modificar esa lista.

El cron de facto

Existen varias implementaciones del gestor cron para escoger en Portage. Todos ofrecen un interfaz similar, el uso del comando crontab o similar. Existe una herramienta relacionada de nombre anacron, que trabaja en conjunto con cron en sistemas que no estén encendidos de manera continua.

Vale la pena mencionar que los paquetes disponibles de cron dependen de sys-process/cronbase. Este paquete técnicamente no aparece en las dependencias de los paquetes cron, pero provee la funcionalidad de tipo cron que la mayoría de los usuarios pueden apreciar.

Antes de empezar a trabajar con cron, habrá que escoger cuál implementación quiere usar. Para su conveniencia, he resumido alguna información acerca de cada una a continuación.

2.  ¿Cual cron le conviene más?

Vixie cron

Vixie cron es un cron pleno de características, basado en el cron SysV. Cada usuario tiene su propio crontab y le está permitido especificar variables de entorno dentro de su crontab. A diferencia de las demás variantes de cron, también tiene soporte para SELinux y PAM. Soporta menos plataformas que Dcron, pero más que Fcron.

Características de sys-process/vixie-cron:

  • Soporte para SELinux
  • Soporte para PAM /etc/security/limits.conf
  • Configuración de variables de entorno en el crontab (PATH, SHELL, HOME, etc.)
  • Cada usuario puede tener su propio crontab, el acceso se controla con los archivos cron.allow y cron.deny

El cron de Dillon

Dcron apunta a ser una sencilla, elegante y segura implementación de cron. No permite especificar variables de entorno en los crontabs y todos los trabajos cron son ejecutados desde /bin/sh. Así como Vixie cron, cada usuario tiene su propio crontab.

Características de sys-process/dcron:

  • Rápido, sencillo y libre de características innecesarias
  • El acceso a crontab se limita al grupo cron, en otras palabras, no requiere capacidad externas

Fcron

Fcron apunta a sustituir Vixie cron y Anacron. Su diseño toma en cuenta los sistemas que no están encendidos de manera continua y está repleto de características adicionales. Tiene restricciones para iniciar los trabajos, control del orden de ejecución, la posibilidad de asignar valores "nice" (prioridad) a los trabajos y para ejecutar trabajos al arrancar el sistema. Vea la página de fcron para mayor información.

Características de sys-process/fcron:

  • Diseñado para funcionar en sistemas que no están constantemente encendidos, por ejemplo, puede ejecutar una tarea después de reiniciar la máquina si la oportunidad de ejecutarla se perdió
  • Configuración de variables de entorno y muchas otras opciones en los crontabs
  • Cada usuario puede tener su propio crontab, el acceso se controla con los archivos cron.allow y cron.deny
  • Sintaxis mejorada de crontab con soporte para muchas características nuevas

bcron

bcron es un sistema cron nuevo, diseñado para operar de manera segura. Para esto el sistema está dividido en varios programas separados, cada uno responsable de una tarea separado con comunicaciones estrictamente controladas entre ellas. El interfaz de usuario es un reemplazo exacto para programas similares (como vixie-cron), aunque la parte interna es muy diferente. Para más información vea la página de bcron en http://untroubled.org/bcron/.

Características de sys-process/bcron:

  • Reemplazo exacto para vixie-cron
  • Diseño multiproceso
  • Soporte nativo para "daylight savings time"

Anacron

Anacron no es un demonio cron, funciona conjuntamente con uno. Ejecuta comandos a intervalos especificados en días y no asume que el sistema está encendido de manera continua; ejecutará las tareas que no pudieron ejecutarse si el sistema estaba apagado. Anacron normalmente requiere un demonio cron para ejecutarlo diariamente.

3.  Usando cron

Instalación

Seleccione la implementación de cron que más le guste e instálela vía emerge.

Listado de Código 3.1: Instalar cron

# emerge dcron
# /etc/init.d/dcron start
# rc-update add dcron default

Opcionalmente, si no ha instalado Fcron, tal vez quiera instalar Anacron.

Listado de Código 3.2: Instalar anacron

# emerge anacron
# /etc/init.d/anacron start
# rc-update add anacron default

El crontab del sistema

Los mensajes post-instalación de algunos de estos paquetes cron le informan que debe ejecutar el comando crontab /etc/crontab. El archivo /etc/crontab es el crontab del sistema. Una instalación de cron lo usa junto a sys-process/cronbase para ejecutar los guiones en /etc/cron.{daily,hourly,weekly,monthly}. Note que solamente Vixie-cron programa las tareas en /etc/crontab automáticamente. Los usuarios de Dcron y Fcron deberán ejecutar crontab /etc/crontab cada vez que hagan cambios a /etc/crontab.

Por favor note que los trabajos programados en el crontab del sistema puede que no aparezcan en la lista de trabajos cron mostrados por crontab -l.

Por supuesto, puede escoger no usar un crontab de sistema. Si escogió a Dcron o Fcron, no ejecute crontab /etc/crontab. Si escogió vixie-cron, debe comentar todas las líneas del /etc/crontab.

Listado de Código 3.3: Comentar todas las líneas en /etc/crontab

# sed -i -e "s/^/#/" /etc/crontab

Dándole acceso a cron a los usuarios confiables

Si desea que otros usuarios que no sean root tengan acceso al demonio cron, deberá leer esta sección, de lo contrario puede proceder a la siguiente sección, programando los trabajos cron.

Nota: Darle acceso a un usuario al crontab no hace que los trabajos se ejecuten como el usuario root. Si desea que un usuario pueda modificar el crontab del usuario root, debe evaluar el uso de sudo. Por favor, lea nuestra Guía de Sudo(ers) de Gentoo para más detalles.

Sin importar qué paquete de cron use, si quiere permitir que un usuario use crontab, primero tendrá que pertenecer al grupo cron. Por ejemplo, si quisiera agregar el usuario wepy al grupo cron ejecute:

Listado de Código 3.4: Agregar un usuario al grupo cron

# gpasswd -a wepy cron

Nota: Cuando agregue el usuario al grupo cron, asegúrese que este salga e ingrese nuevamente al sistema para que el cambio de grupo tenga efecto.

Es todo lo que tiene que hacer para darle a un usuario acceso al crontab, si está usando Dcron. Los usuarios de Dcron pueden saltar a la siguiente sección programando los trabajos cron, los demás querrán seguir leyendo.

Si está usando Fcron, querrá modificar los archivos /etc/fcron/fcron.deny y /etc/fcron/fcron.allow. La manera más segura es primero negarle acceso a todo el mundo en /etc/fcron/fcron.deny y luego, explícitamente permitir acceso a los usuarios en /etc/fcron/fcron.allow.

Importante: Si no existen los archivos /etc/fcron/fcron.allow o /etc/fcron/fcron.deny, se les permitirá a todos los usuarios del grupo cron usar el crontab. fcron viene con un fcron.allow por defecto que permite que todos los usuarios del grupo cron tengan acceso a fcrontab.

Listado de Código 3.5: Los permisos en fcron.deny

all

Ahora, digamos que tenemos un usuario, wepy, quien debería poder programar sus propios trabajos cron. Debemos agregarlo a /etc/fcron/fcron.allow de la siguiente manera:

Listado de Código 3.6: Los permisos en fcron.allow

wepy

Si escogió Vixie cron, probablemente querrá modificar el archivo /etc/cron.allow solamente.

Importante: Es importante notar que solamente si existe el archivo /etc/cron.allow, los usuarios del grupo cron allí listados tendrán acceso, pero sólo si existe un archivo /etc/cron.deny vacío, ¡Entonces todos los usuarios del grupo cron se les permitirá acceso! No permita que haya un /etc/cron.deny vacío si no existe el /etc/cron.allow.

Por ejemplo, si quiere permitirle acceso al usuario wepy, agréguelo a /etc/cron.allow de la siguiente manera:

Listado de Código 3.7: Los permisos en /etc/cron.allow

wepy

Programando trabajos cron

El proceso de modificar los archivos crontab es distinto para cada paquete, pero todos soportan el mismo conjunto básico de comandos: agregando y reemplazando crontabs, modificando crontabs, borrando crontabs y listando los trabajos en los crontabs. La siguiente lista muestra cómo ejecutar estos comandos para cada paquete.

Versión Editar crontab Borrar crontab Nuevo crontab Listar tareas programadas
dcron crontab -e crontab -d [usuario] crontab file crontab -l
fcron fcrontab -e fcrontab -r [usuario] fcrontab file fcrontab -l
vixie-cron & bcron crontab -e crontab -r -u [usuario] crontab file crontab -l

Nota: Cuando use el comando para borrar un crontab, de no pasarle un parámetro, este borra el crontab del usuario actual.

Nota: Fcron también posee un enlace simbólico desde crontab a fcrontab.

Antes de poder usar cualquiera de estos comandos, primero hace falta entender el propio crontab. Cada línea en un crontab debe especificar cinco campos de tiempo en el siguiente orden: los minutos (0-59), las horas (0-23), los días del mes (1-31), los meses (1-12) y los días de la semana (0-7, lunes es 1, el domingo es 0 y 7). Los días de las semanas y meses pueden ser especificados por abreviaturas de tres letras (en inglés), como mon, tue, jan, feb, etc. Cada campo también puede especificar un rango de valores (por ejemplo, 1-5 o mon-fri), una lista separada por comas de valores (por ejemplo, 1,2,3 o mon,tue,wed) o un rango de valores con paso (por ejemplo, 1-6/2 para 1,3,5).

Tal vez suene algo confuso, pero con algunos ejemplos, verán que no es tan complicado como parece.

Listado de Código 3.8: Ejemplos

# Corra /bin/false cada minuto todo el año
*     *     *     *     *        /bin/false

# Corra /bin/false a la 1:35 el lunes,martes,miércoles
(mon,tue,wed) y el día 4 de cada mes
35    1     4     *     mon-wed  /bin/false

# Corra /bin/true a las 22:25 el 2 de marzo
25    22    2     3     *        /bin/true

# Corra /bin/false a las 2:00 cada lunes, miércoles y viernes
0     2     *     *     1-5/2    /bin/false

Nota: Note que tiene que nombrar días específicos de la semana y días del mes para poder combinarlos. Si tienen un * para uno de ellos, el otro toma precedencia, mientras que un * en ambos campos significa diariamente.

Para poner a prueba lo que hemos aprendido, registraremos paso a paso algunos trabajos cron. Primero, crearemos un archivo llamado crons.cron de la siguiente manera:

Listado de Código 3.9: Editar crons.cron

$ nano crons.cron
#Mins  Horas  Días   Meses  Día de la semana
10     3      1      1       *       /bin/echo "Realmente no me gusta cron"
30     16     *      1,2     *       /bin/echo "Me gusta cron un poco"
*      *      *      1-12/2  *       /bin/echo "Realmente me gusta cron"

Ahora podemos agregar ese crontab al sistema con el comando "Nuevo Crontab" de la tabla anterior.

Listado de Código 3.10: Un crontab nuevo

# crontab crons.cron

Nota: No verá la salida de estos comandos si no se usa la redirección.

Para verificar los trabajos cron programados, usaremos el comando "Listar tareas programadas" apropiado, tomado de la tabla anterior.

Listado de Código 3.11: Listar los trabajos cron

# crontab -l

Debe ver ahora una lista parecida a crons.cron, si no, a lo mejor ha usado un comando equivocado para ingresar su nuevo crontab.

Este crontab debe hacer presentar el texto "Realmente me gusta cron" cada minuto de cada hora de cada día en meses alternos. Obviamente esto sólo lo haría si realmente le gustara cron. Este crontab también presentará el texto "Me gusta cron un poco" a las 16:30 horas todos los días en Enero y Febrero. También presentará "Realmente no me gusta cron" a las 03:10 horas el 1 de enero.

Si está usando Anacron, siga leyendo esta sección, sino proceda a la sección siguiente, acerca de modificando los crontabs.

Los usuarios de Anacron querrán modificar /etc/anacrontab. Este archivo está dividido en cuatro campos: el número de días entre cada ejecución, el retraso en minutos luego de cada ejecución, el nombre del trabajo y el comando a ejecutar.

Por ejemplo, para hacer que ejecute echo "Me gusta anacron" cada 5 días, 10 minutos después de arrancar Anacron, haríamos:

Listado de Código 3.12: /etc/anacrontab

5 10 perdiendo-tiempo /bin/echo "Me gusta anacron"

Anacron termina de ejecutar después que haya ejecutado todos los trabajos en anacrontab, así que si queremos que realice estos trabajos todos los días, tendremos que usar cron. Las instrucciones al final de la siguiente sección explicarán cómo hacer ésto.

Editando los crontabs

Bueno, vamos a ser realistas, realmente no nos interesa que nuestro sistema nos diga cuanto le gusta cron cada minuto. Así que el siguiente paso es eliminar ese crontab usando el comando "Borrar crontab" correspondiente de la tabla anterior. Después listaremos los trabajos cron, para asegurarnos que lo que eliminamos funcionó.

Listado de Código 3.13: Eliminar un crontab

# crontab -d
# crontab -l

No debería haber trabajos cron en la salida del comando crontab -l. Si ve alguno, es porque no eliminamos nuestro crontab, por lo que debe asegurarse de usar el comando "Borrar crontab" correspondiente a su paquete cron.

Ahora que estamos en cero, vamos a colocar algo útil en el crontab de root. La mayoría de usuarios querrán ejecutar updatedb semanalmente para que mlocate funcione correctamente. Para hacer esto primero modificaremos crons.cron para que se vea algo como:

Listado de Código 3.14: Un crontab de verdad

22 2 * * 1    /usr/bin/updatedb

Esto hará que cron ejecute updatedb a las 2:22 am todos los lunes. Ingrese el crontab con el comando "Nuevo Crontab" adecuado de la tabla anterior y revise la lista otra vez.

Listado de Código 3.15: Listar los trabajos cron

# crontab crons.cron
# crontab -l

Ahora, digamos que también quiere agregar emerge --sync a sus trabajos programados diarios. Esto lo puede hacer primero modificando crons.cron y luego usando crontab crons.cron tal como hicimos anteriormente o el sencillamente con el comando "Editar Crontab" apropiado de la tabla anterior, lo cual permite modificar el crontab del usuario in situ sin depender de archivos externos como crons.cron.

Listado de Código 3.16: Editar un crontab in situ

# crontab -e

Esto deberá abrir el crontab del usuario con un editor de texto. Queremos que emerge --sync se ejecute diariamente a las 6:30 am, por lo que se vería algo como:

Listado de Código 3.17: Un crontab de verdad

22 2 * * 1    /usr/bin/updatedb
30 6 * * *    /usr/bin/emerge --sync
(si está usando anacron, agregue esta línea)
30 7 * * *   /usr/sbin/anacron -s

Una vez más, revise la lista de trabajos cron, como hicimos en los ejemplos anteriores para asegurarnos que los trabajos estén realmente programados. Si todos están allí, está listo.

4.  Usando cronbase

Como se mencionó antes, los paquetes cron disponibles dependen de sys-process/cronbase. El paquete cronbase crea /etc/cron.{hourly,daily,weekly,monthly} y un guión llamado run-crons. Puede que se haya dado cuenta que el archivo /etc/crontab por defecto contiene algo como esto:

Listado de Código 4.1: Crontab del sistema por defecto

*/15 * * * *     test -x /usr/sbin/run-crons && /usr/sbin/run-crons
0  *  * * *      rm -f /var/spool/cron/lastrun/cron.hourly
0  3  * * *      rm -f /var/spool/cron/lastrun/cron.daily
15 4  * * 6      rm -f /var/spool/cron/lastrun/cron.weekly
30 5  1 * *      rm -f /var/spool/cron/lastrun/cron.monthly

Para evitar entrar en mayores detalles, podemos asumir que estos comandos efectivamente ejecutan sus guiones cada hora, día, semana o mes. Este método de calendarización de tareas tiene algunas ventajas importantes:

  • Las tareas se ejecutarán incluso si su computadora fue apagada cuando estaban programadas para ejecutarse.
  • Es fácil para los mantenedores de paquetes ubicar los guiones en esos lugares definidos.
  • Conoce exactamente donde se guardan sus tareas y crontab, facilitándole el proceso de respaldo y recuperación de esta parte de su sistema.

Nota: Nuevamente, es útil señalar que Vixie cron y bcron leen automáticamente el archivo /etc/crontab, mientras que dcron y fcron no lo hacen. Por favor, lea la sección El crontab del sistema para aprender más sobre esto.

5.  Notas finales

En caso de problemas

Si está teniendo problemas para hacer que cron funcione correctamente, tal vez quiera chequear esta lista.

  • ¿Está corriendo cron? Ejecute ps ax | grep cron. Si está siendo ejecutado, ¡aparecerá!
  • ¿Está funcionando cron? Intente: * * * * * /bin/echo "foobar" >> /su_archivo y asegúrese que funciona
  • ¿Su comando funciona? Intente: * * * * * /bin/foobar > /su_archivo 2>&1, busque mensajes de error en /su_archivo
  • ¿Podrá cron ejecutar su trabajo? Revise el registro (log) de cron, normalmente en /var/log/cron.log o /var/log/messages y busque mensajes de error
  • ¿Aparecen dead.letters? Normalmente cron envía correos cuando hay algún problema, revise su buzón y busque ~/dead.letter

Acuérdese que cada paquete cron es distinto y que la gama de características varía bastante. Consulte las páginas del manual de crontab, fcrontab o anacrontab, dependiendo de cuál versión use.

¡Buena suerte!



Imprimir

Página actualizada 14 de noviembre, 2010

Sumario: Esta guía describe cómo configurar y usar cron.

Eric Brown
Autor

Xavier Neys
Editor

Joshua Saddler
Editor

John Christian Stoddart
Traductor

José Luis Rivero
Traductor

Donate to support our development efforts.

Copyright 2001-2013 Gentoo Foundation, Inc. Questions, Comments? Contact us.