Guía Gentoo Linux de Cron
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 |
* * * * * /bin/false
35 1 4 * mon-wed /bin/false
25 22 2 3 * /bin/true
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
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
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!
El contenido de este documento, a no ser que se especifique
expresamente, está registrado bajo los términos de la licencia
CC-BY-SA-2.5. Se aplican las
Pautas de
Utilización del logotipo y nombre de Gentoo.
|