CONOCEDGEBASE · LINUX
Configuración de Cron Jobs
Última actualización 2020-01-18
Por favor, compruebe si tiene una cuenta de correo electrónico válida para recibir los correos electrónicos. Por favor lea el siguiente artículo sobre 'Configuración de Empleos de Cron' y si aún necesita ayuda, levante un ticket de soporte.
Cron es un aspecto comúnmente confuso y malconfigurado del sistema operativo. Técnicamente, el cron es sólo el daemon del reloj (/usr/sbin/cron o tal vez /usr/sbin/crond) que ejecuta comandos en momentos específicos. Sin embargo, un puñado de archivos de configuración y programas van a inventar el paquete cron. Como muchos procesos del sistema, el cron nunca termina. Los archivos controladores para cron son las tablas de cron o crontabs. Los crontabs se encuentran a menudo en /var/spool/cron/crontab. Sin embargo, en SuSE los encontrará en /var/spool/cron/tabs. Los nombres de los archivos en este directorio son los nombres de los usuarios que envían los trabajos de cron.
A diferencia de otros dialectos UNIX, el daemon de cron Linux no duerme hasta que el próximo trabajo de cron esté listo. En cambio, cuando cron complete un trabajo, seguirá comprobando una vez al minuto para que se ejecuten más empleos. Además, no debe editar los archivos directamente. Puedes editarlos con un editor de texto como vi, aunque hay el potencial para arruinar las cosas. Por lo tanto, debe utilizar la herramienta que Linux proporciona: crontab. (ver la página de hombre para más detalles)
La utilidad crontab tiene varias funciones. Es el medio por el cual se presentan al sistema archivos que contienen los trabajos de cron. Segundo, puede enumerar el contenido de su crontab. Si usted es root, también puede enviar y listar trabajos para cualquier usuario. El problema es que no se pueden presentar trabajos individualmente. Usando crontab, debes presentar todos los trabajos al mismo tiempo.
Al principio, eso podría sonar un poco molesto. Sin embargo, echemos un vistazo al proceso de "reunión" un trabajo. Para añadir un trabajo de cron, primero debe enumerar el contenido del crontab existente con la opción -l. Si usted es root y desea agregar algo a la crontab de otro usuario, utilice la opción -u seguido por el nombre de registro del usuario. Luego redirige este crontab a un archivo, que luego puede editar. (Nota que en algunos sistemas crontab tiene -e (para "edit"), que hará todo el trabajo para usted. Vea la página de hombre para más detalles.)
Por ejemplo, digamos que usted es el usuario raíz y quiere añadir algo al crontab del usuario UUCP. Primero, obtener la salida de la entrada crontab existente con este comando:
crontab -l -u uucp ó/tmp/crontab.uucp
Para añadir una entrada, simplemente incluya una nueva línea. Guarda el archivo, sal de tu editor, y vuelve a ejecutar la utilidad crontab. Esta vez, omitir el -l para enumerar el archivo pero incluir el nombre del archivo. La utilidad crontab también puede aceptar la entrada de stdin, por lo que podría dejar el nombre del archivo y crontab le permitiría introducir los cronjobs en la línea de comandos. Tenga en cuenta que cualquier crontab anterior es eliminado sin importar el método que utilice.
El archivo /tmp/crontab.uucp ahora contiene el contenido de UUCPs crontab. Puede parecer algo así:
39,9 * * * * * /usr/lib/uucp/uudemon.hour ó /dev/null
10 * * * * * * /usr/lib/uucp/uudemon.poll ó /dev/null
45 23 * * * ulimit 5000; /usr/lib/uucp/uudemon.clean ód@dev/null
48 10,14 * * 1-5 /usr/lib/uucp/uudemon.admin ó /dev/null
A pesar de su apariencia, cada entrada crontab consta de sólo seis campos. Los primeros cinco representan el tiempo que el trabajo debe ser ejecutado y el sexto es el comando real. Los primeros cinco campos están separados por un espacio o una pestaña y representan las siguientes unidades, respectivamente:
minutos (0-59)
hora (0-23)
día del mes (1-31)
mes del año (1-12)
día de la semana (0-6, 0=domingo)
Para especificar todos los valores posibles, utilice un asterisco (*). Puede especificar un valor único simplemente incluyendo ese valor. Por ejemplo, la segunda línea del ejemplo anterior tiene un valor de 10 en el primer campo, que significa 10 minutos después de la hora. Debido a que todos los otros cuatro campos de tiempo son asteriscos, esto significa que el comando se ejecuta cada hora de cada día a 10 minutos más allá de la hora.
Los rangos de valores están compuestos por el primer valor, un dash y el valor final. Por ejemplo, la cuarta línea tiene un rango (1-5) en el día de la columna de la semana, lo que significa que el comando sólo se ejecuta en los días 1-5, de lunes a viernes.
Para especificar diferentes valores que no están dentro de un rango, separa los valores individuales por un coma. En el cuarto ejemplo, el campo de hora tiene los dos valores 10 y 14. Esto significa que el comando se ejecuta a las 10.00 y a las 14.
Tenga en cuenta que los tiempos son aditivos. Veamos un ejemplo:
10 * 1,16 * 1-5 /usr/local/bin/command
El comando se ejecuta 10 minutos después de cada hora en el primero y el 16, así como de lunes a viernes. Si el primero o el 16o se celebran en un fin de semana, el comando seguirá funcionando porque el día del mes se aplicaría. Sin embargo, esto no significa que si el primero es un lunes, el comando se ejecuta dos veces.
La entrada crontab se puede definir para funcionar a intervalos diferentes que cada hora o cada día. La granularidad se puede especificar a cada dos minutos o cada tres horas sin tener que poner cada entrada individual en el crontab.
Digamos que queríamos ejecutar el comando anterior no a 10 minutos después de la hora, sino cada diez minutos. Podríamos hacer una entrada que se parecía a esto:
0,10,20,30,40,50 * 1,16 * 1-5 /usr/local/bin/command
Esto funciona cada 10 minutos: en la parte superior de la hora, 10 minutos después, 20 minutos después, y así sucesivamente. Para facilitar la vida, simplemente podríamos crear la entrada como esta:
*/10 * 1,16 * 1-5 /usr/local/bin/command
Esta sintaxis puede ser nueva para algunos administradores. (Fue para mí.) El slash (/) dice que dentro del intervalo específico (en este caso, cada minuto), ejecutar el comando cada tantos minutos; en este caso, cada 10 minutos.
También podemos utilizar esto incluso cuando especificamos un rango. Por ejemplo, si el trabajo se supone que sólo funcionaba entre 20 minutos después de la hora y 40 minutos después de la hora, la entrada podría parecerse a esto:
20-40 * 1,16 * 1-5 /usr/local/bin/command
¿Y si querías que corriera en estos momentos, pero sólo cada tres minutos? La línea podría parecerse a esto:
20-40/3 * 1,16 * 1-5 /usr/local/bin/command
Para hacer las cosas aún más complicadas, podría decir que quería que el comando funcionara cada dos minutos entre la hora y 20 minutos después, cada tres minutos entre 20 y 40 minutos después, luego cada 5 minutos entre 40 minutos después y la hora.
0-20/2,21-40/3,41-59/5 * 1,16 * 1-5 /usr/local/bin/command
Una cosa muy agradable que muchos dialectos de Linux hacen es permitir que especifique abreviaturas para los días de la semana y los meses. Es mucho más fácil recordar que la frita es para el viernes en lugar de 5.
Con la excepción de ciertos errores en los campos de tiempo, los errores no se reportan hasta que cron ejecuta el comando. Todos los mensajes de error y salida se envían por correo a los usuarios. Al menos eso es lo que dice la página de los crontab y eso es básicamente verdad. Sin embargo, como se ve en los ejemplos anteriores, usted está redireccionando stdout a /dev/null. Si quisieras, también podrías redirigir a stderr allí y nunca verías si había algún error.
La salida se envía al usuario porque no hay terminal real en la que se ejecutan los cronjobs. Por lo tanto, no hay pantalla para mostrar los errores. Además, no hay teclado para aceptar entrada. ¿Eso significa que no puedes dar entrada a un trabajo de cron? No. Piense en la discusión sobre los scripts de shell. Podemos redefinir el stdin, el stdout y el stderr. De esta manera todos pueden apuntar a los archivos y comportarse como esperamos.
Una cosa que me gustaría señalar es que no abono hacer la redirección en el campo de mando del crontab. Me gusta hacer lo más pequeño posible. En cambio, puse el camino absoluto a un guión de shell. Puedo probar la entrada crontab con algo simple. Una vez que eso funcione, puedo hacer cambios en el script de shell sin tener que volver a presentar el cronjob.
Tenga en cuenta que el cron no es exacto. Se sincroniza a sí mismo a la parte superior de cada minuto. En un sistema ocupado en el que pierdes las garrapatas del reloj, los trabajos pueden no ser ejecutados hasta un par de minutos después del tiempo programado. Además, puede haber otros procesos con prioridades más altas que retrasan los empleos de cron. En algunos casos, los empleos (en particular en sistemas muy ocupados) podrían terminar siendo saltados si se ejecutan cada minuto.
El acceso se permite a la instalación de cron a través de dos archivos, ambos en /etc. Si tiene un archivo cron.allow, puede especificar qué usuarios se permiten utilizar cron. El cron.deny dice que no se permite específicamente usar cron. Si no existe ningún archivo, sólo los usuarios del sistema tienen acceso. Sin embargo, si quieres que todos tengan acceso, crea un archivo cron.deny de entrada. En otras palabras, nadie se le niega el acceso.
A menudo es útil para root ejecutar trabajos como usuario diferente sin tener que cambiar usuarios (por ejemplo, usando el comando su). La mayoría de los dialectos de Linux proporcionan un mecanismo en forma de archivo /etc/crontab. Este archivo es normalmente sólo comprimible por root y en algunos casos, sólo root puede leerlo (que a menudo es necesario en entornos de alta seguridad). La sintaxis general es la misma que los crontabs estándar, con un par de excepciones.
La primera diferencia es el encabezado, que se puede ver aquí:
SHELL=/bin/sh
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
MAILTO=root
#
# check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly
#
59 * * * * * root rm -f /var/spool/cron/lastrun/cron.hourly
14 0 * * * root rm -f /var/spool/cron/lastrun/cron.daily
29 0 * * 6 root rm -f /var/spool/cron/lastrun/cron.weekly
44 0 1 * * root rm -f /var/spool/cron/lastrun/cron.monthly
La variable SHELL define la cáscara bajo la cual cada comando ejecutará. La variable PATH es como la variable de entorno PATH normal y define el camino de búsqueda. La variable MAILTO dice quién debe recibir mensajes de correo electrónico, que incluye mensajes de error y la salida estándar de la ejecutando órdenes.
La estructura de las entradas reales es prácticamente igual con la excepción del nombre de usuario (root en cada caso aquí). De esta manera, los usuarios de raíz (o quien pueda editar /etc/crontab) pueden definir qué usuario ejecuta el comando. Tenga en cuenta que esto puede ser un gran agujero de seguridad. Si alguien puede escribir a este archivo, puede crear una entrada que funciona como raíz y por lo tanto tiene control completo del sistema.
El siguiente comando en el cron "suite" está en. Su función es ejecutar un comando en un momento específico. La diferencia es que una vez que el trabajo ha funcionado, desaparece del sistema. En cuanto a cron, dos archivos, a.allow y a.deny, tienen el mismo efecto en el programa.
El comando de lote también se utiliza para ejecutar comandos una vez. Sin embargo, los comandos enviados con lote se ejecutan cuando el sistema se acerca a él, lo que significa cuando el sistema está menos ocupado, por ejemplo, en medio de la noche. Es posible que estos trabajos se extiendan durante todo el día, dependiendo de la carga del sistema.
Una cosa a observar es el comportamiento de at y lote. Ambos aceptan los nombres de los comandos de la línea de comandos y no como argumentos al comando en sí. Primero debe ejecutar el comando para ser llevado a una nueva línea, donde usted introduzca los comandos que desea ejecutar. Después de cada comando, pulse Enter. Cuando termines, presione a Ctrl-D.
Debido a que estos dos comandos aceptan comandos de stdin, puede introducir el comando sin tener que hacerlo en una nueva línea cada vez. Una posibilidad es para redirigir la entrada de un archivo. Por ejemplo
a la hora +1 hora
donde command list es un archivo que contiene una lista de comandos. También podría tener en (o lote) como el final de una tubería
cat command list Silencio en este momento + 1 hora
cat command list Silencioso lote
Otra cosa interesante tanto en el lote como en el lote es que crean una especie de script de shell para ejecutar su comando. Cuando se ejecuta en o lote, se crea un archivo en /usr/spool/cron/atjobs. Este archivo contiene las variables del sistema que normalmente habría definido, más alguna otra información que está contenida en /usr/lib/cron.proto. Esto crea esencialmente un ambiente como si hubieras iniciado sesión.
Díganos qué tiene que estar levantado.
Una breve conversación con un ingeniero. Sin cita-bot, sin cola de callback.