ALL SYSTEMS OPERATIONALUPTIME 99.97%FLEET 18/18IN-MUM · US-LAX · EU-FSN EST. 2003 · +91 11 4998 4038

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 is a commonly confusing and misconfigured aspect of the operating system. Technically, cron is just the clock daemon (/usr/sbin/cron or perhaps /usr/sbin/crond) that executes commands at specific times. However, a handful of configuration files and programs go into making up the cron package. Like many system processes, cron never ends.

The controlling files for cron are the cron-tables or crontabs. The crontabs are often located in /var/spool/cron/crontab. However, on SuSE you will find them in /var/spool/cron/tabs. The names of the files in this directory are the names of the users that submit the cron jobs.

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.

The file /tmp/crontab.uucp now contains the contents of UUCPs crontab. It might look something like this:

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 > /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.

To specify different values that are not within a range, separate the individual values by a comma. In the fourth example, the hour field has the two values 10 and 14. This means that the command is run at 10 a.m. and 2 p.m.

Tenga en cuenta que los tiempos son aditivos. Veamos un ejemplo:


10 * 1,16 * 1-5 /usr/local/bin/command


The command is run 10 minutes after every hour on the first and sixteenth, as well as Monday through Friday. If either the first or the sixteenth were on a weekend, the command would still run because the day of the month field would apply. However, this does not mean that if the first is a Monday, the command is run twice.

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.

It is often useful for root to run jobs as a different user without having to switch users (for example, using the su command). Most Linux dialects provide a mechanism in the form of the /etc/crontab file. This file is typically only writable by root and in some cases, only root can read it (which is often necessary in high security environments). The general syntax is the same as the standard crontabs, with a couple of exceptions.

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.

The structure of the actual entries is pretty much the same with the exception of the user name (root in each case here). This way, the root users (or whoever can edit /etc/crontab) can define which user executes the command. Keep in mind that this can be a big security hole. If someone can write to this file, they can create an entry that runs as root and therefore has complete control of the system.

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

Another interesting thing about both at and batch is that they create a kind of shell script to execute your command. When you run at or batch, a file is created in /usr/spool/cron/atjobs. This file contains the system variables that you would normally have defined, plus some other information that is contained in /usr/lib/cron.proto. This essentially creates an environment as though you had logged in.

← Todos los artículos de base de conocimientos

Díganos qué tiene que estar levantado.

A short conversation with an engineer. No quote-bot, no callback queue. We'll tell you honestly if we're not the right fit.