¿No sabes por dónde empezar? Ayúdanos normalizando artículos.
¿Tienes experiencia? Crea alguno de estos artículos de actualidad.

Diferencia entre revisiones de «Cron (Unix)»

(Capacidad Multi-usuario)
(Sintaxis)
 
(No se muestran 9 ediciones intermedias de 3 usuarios)
Línea 1: Línea 1:
El nombre ''cron'' viene del griego ''chronos'' que significa "tiempo". En el [[sistema operativo]] [[Unix]], '''cron''' es un administrador regular de [[proceso]]s en segundo plano (''[[Demonio (informática)|demonio]]'') que ejecuta procesos o [[guión (informática)|guiones]] a intervalos regulares (por ejemplo, cada minuto, día, semana o mes). Los procesos que deben ejecutarse y la hora en la que deben hacerlo se especifican en el fichero <code>crontab</code>.
+
{{Ficha Software
 
+
|nombre=cron
'''Cron''' se podría definir como el "equivalente" a Tareas Programadas de [[Windows]].
+
|familia=
 
+
|imagen=
 +
|tamaño=
 +
|descripción=
 +
|imagen2=
 +
|tamaño2=
 +
|descripción2=
 +
|creador=
 +
|desarrollador=
 +
|diseñador=
 +
|modelo de desarrollo=
 +
|lanzamiento inicial=
 +
|versiones=
 +
|última versión estable=
 +
|género=
 +
|sistemas operativos=Unix
 +
|idioma=
 +
|licencia=
 +
|premios=
 +
|web=
 +
}}
  
 +
'''cron.''' Es un administrador regular de procesos en segundo plano para [[Sistema operativo|sistemas operativos]] de tipo [[Unix]] que ejecuta procesos a intervalos regulares. Es comúnmente utilizado  para automatizar procesos como mantenimientos de sistema o administración o para iniciar scripts que deben ser ejecutados cada cierto tiempo.
  
 
== Vista General==
 
== Vista General==
Línea 16: Línea 36:
  
 
== Historia ==
 
== Historia ==
 +
 
=== Primeras versiones ===
 
=== Primeras versiones ===
 
Cron en [[UNIX_Versión_7|Unix versión7]], escrita por [[Brian Kernighan]], fue un sistema de servicio (después llamado [[Demonio_(informática)|demonio]]) invocado de <code>/etc/inittab</code> cuando el {{Sistema_operativo|S.O.]] entròen modo multiusuario.  Este algoritmo fue sencillo:
 
Cron en [[UNIX_Versión_7|Unix versión7]], escrita por [[Brian Kernighan]], fue un sistema de servicio (después llamado [[Demonio_(informática)|demonio]]) invocado de <code>/etc/inittab</code> cuando el {{Sistema_operativo|S.O.]] entròen modo multiusuario.  Este algoritmo fue sencillo:
Línea 30: Línea 51:
  
 
=== Versiones Modernas ===
 
=== Versiones Modernas ===
Con la ventaja del proyecto [[GNU]] y [[Linux]], apareció un nuevo cron.  Lo más relevante de este es el cron Vixie, originalmente codificado por [[Paul Vixie]] en 1987. Versión 3 de '''cron Vixie''' fue liberado después de 1993. Version 4.1 fue renombrada como '''Cron [[Internet Systems Consortium|ISC (Consorcio de Sistema de Internet)]]''' y fue liberado en Enero del 2004. Versión 3, con unas mínimas correcciones de error, es usadd en la mayoria de las distribuciones de Linux y BSDs.
+
 
 +
Con la ventaja del proyecto [[GNU]] y [[Linux]], apareció un nuevo cron.  Lo más relevante de este es el cron Vixie, originalmente codificado por [[Paul Vixie]] en 1987. Versión 3 de '''cron Vixie''' fue liberado después de 1993. Versión 4.1 fue renombrada como '''Cron [[Internet Systems Consortium|ISC (Consorcio de Sistema de Internet)]]''' y fue liberado en Enero del 2004. Versión 3, con unas mínimas correcciones de error, es usadd en la mayoría de las distribuciones de Linux y BSDs.
  
 
En 2007, RedHat bifucó cron-vixie 4.1 al proyecto cronie e incluyó anacron 2.3 en 2009.
 
En 2007, RedHat bifucó cron-vixie 4.1 al proyecto cronie e incluyó anacron 2.3 en 2009.
  
 
Otra implementación popular incluye [[anacron]] y [[fcron]]. De cualquier forma, [[anacron]]  no es un programa cron independiente; se basa en otro programa cron para llamarlo en orden para ejecutarse.
 
Otra implementación popular incluye [[anacron]] y [[fcron]]. De cualquier forma, [[anacron]]  no es un programa cron independiente; se basa en otro programa cron para llamarlo en orden para ejecutarse.
 
== Iniciar cron ==
 
Cron es un demonio (servicio), lo que significa que solo requiere ser iniciado una vez, generalmente con el mismo arranque del sistema. El servicio de cron se llama crond. En la mayoría de las distribuciones el servicio se instala automáticamente y queda iniciado desde el arranque del sistema, se puede comprobar de varias maneras:
 
<syntaxhighlight lang="bash">
 
#> /etc/rc.d/init.d/crond status
 
#> /etc/init.d/crond status  Usa cualquiera de los dos dependiendo de tu distro
 
crond (pid 507) is running...
 
 
o si tienes el comando service instalado:
 
#> service crond status
 
crond (pid 507) is running...
 
 
se puede también revisar a través del comando ps:
 
# ps -ef  |  grep crond
 
 
si por alguna razón, cron no esta funcionando:
 
#> /etc/rc.d/init.d/crond start
 
Starting crond:            [ OK ]
 
 
</syntaxhighlight>
 
Si el servicio no estuviera configurado para arrancar desde un principio, bastaría con agregarlo con el comando chkconfig:
 
<syntaxhighlight lang="bash">
 
#> chkconfig --level 35 crond on
 
</syntaxhighlight>
 
  
 
== Formato del fichero ''crontab'' ==
 
== Formato del fichero ''crontab'' ==
Línea 91: Línea 89:
  
 
=== Sintaxis ===
 
=== Sintaxis ===
 +
 
El formato de configuración de cron es muy sencillo.
 
El formato de configuración de cron es muy sencillo.
  
*El símbolo almohadilla «#» es un comentario, todo lo que se encuentre después de ese carácter no será ejecutado por ''cron''.
+
El momento de ejecución se especifica de acuerdo con la siguiente tabla:
  
*El momento de ejecución se especifica de acuerdo con la siguiente tabla:
+
*Minutos: (0-59)
# Minutos: (0-59)
+
*Horas: (0-23)
# Horas: (0-23)
+
*Días: (1-31)
# Días: (1-31)
+
*Mes: (1-12)
# Mes: (1-12)
+
*Día de la semana: (0-6), siendo  1=lunes, 2=martes,... 6=sábado y 0=domingo (a veces también 7=domingo)
# Día de la semana: (0-6), siendo  1=lunes, 2=martes,... 6=sábado y 0=domingo (a veces también 7=domingo)
 
  
##########################################################
+
<pre>
#minuto (0-59),                                         #
+
minuto (0-59),
#| hora (0-23),                                         #
+
|   hora (0-23),
#| |  día del mes (1-31),                               #
+
|   |  día del mes (1-31),
#| |  |  mes (1-12),                                   #
+
|   |  |  mes (1-12),
#| |  |  |  día de la semana (0-6 donde 0=Domingo)     #
+
|   |  |  |  día de la semana (0-6 donde 0=Domingo)
#| |  |  |  |      comandos                           #
+
|   |  |  |  |      comandos
##########################################################
+
15 02  *  *  *
15 02  *  *  *
+
</pre>
  
:Para especificar todos los valores posibles de una variable se utiliza un [[asterisco]] (*).
+
*Para especificar todos los valores posibles de una variable se utiliza un asterisco (*).
 +
*La última columna corresponde a la ruta absoluta del binario o script que se quiere ejecutar.
  
*La última columna corresponde a la [[Ruta (informática)|ruta]] absoluta del binario o ''script'' que se quiere ejecutar.
+
===Definición de horarios predefinidos===
  
{| cellspacing="1" cellpadding="1" border="1"
 
|-
 
! scope="col" | Ejemplo
 
! scope="col" | Descripción
 
|-
 
| 01 * * * *
 
| Se ejecuta al minuto 1 de cada hora de todos los días
 
|-
 
| 15 8 * * *
 
| A las 8:15 a.m. de cada día
 
|-
 
| 15 20 * * *
 
| A las 8:15 p.m. de cada día
 
|-
 
| 00 5 * * 0
 
| A las 5 a.m. todos los domingos
 
|-
 
| * 5 * * Sun
 
| Cada minuto de 5:00a.m. a 5:59a.m. todos los domingos
 
|-
 
| 45 19 1 * *
 
| A las 7:45 p.m. del primero de cada mes
 
|-
 
| 01 * 20 7 *
 
| Al minuto 1 de cada hora del 20 de julio
 
|-
 
| 10 1 * 12 1
 
| A la 1:10 a.m. todos los lunes de diciembre
 
|-
 
| 00 12 16 * Wen
 
| Al mediodía de los días 16 de cada mes y que sea Miércoles
 
|-
 
| 30 9 20 7 4
 
| A las 9:30 a.m. del dia 20 de julio y que sea jueves
 
|-
 
| 30 9 20 7 *
 
| A las 9:30 a.m. del dia 20 de julio sin importar el día de la semana
 
|-
 
| 20 * * * 6
 
| Al minuto 20 de cada hora de los sábados
 
|-
 
| 20 * * 1 6
 
| Al minuto 20 de cada hora de los sábados de enero
 
|-
 
| 59 11 * 1-3 1,2,3,4,5
 
| A las 11:59 a.m. de lunes a viernes, de enero a marzo
 
|-
 
| 45 * 10-25 * 6-7
 
| Al minuto 45 de todas las horas de los días 10 al 25 de todos los meses y que el día sea sábado o domingo
 
|-
 
| 10,30,50 * * * 1,3,5
 
| En el minuto 10, 30 y 50 de todas las horas de los días lunes, miércoles y viernes
 
|-
 
| */15 10-14 * * *
 
| Cada quince minutos de las 10:00a.m. a las 2:00p.m.
 
|-
 
| * 12 1-10/2 2,8 *
 
| Todos los minutos de las 12 del día, en los días 1,3,5,7 y 9 de febrero a agosto. (El incremento en el tercer campo es de 2 y comienza a partir del 1)
 
|-
 
| 0 */5 1-10,15,20-23 * 3
 
| Cada 5 horas de los días 1 al 10, el día 15 y del día 20 al 23 de cada mes y que el día sea miércoles
 
|-
 
| 3/3 2/4 2 2 2
 
| Cada 3 minutos empezando por el minuto 3 (3,6,9, etc.) de las horas 2,6,10, etc (cada 4 horas empezando en la hora 2) del día 2 de febrero y que sea martes
 
|}
 
 
Como se puede apreciar en el último ejemplo la tarea cron que estuviera asignada a ese renglón con esos datos, solo se ejecutaría si se cumple con los 5 campos (AND). Es decir, para que la tarea se ejecute tiene que ser un martes 2 de febrero a las 02:03. Siempre es un AND booleano que solo resulta verdadero si los 5 campos son ciertos en el minuto específico.
 
 
El caso anterior deja claro entonces que:
 
 
El programa cron se invoca cada minuto y ejecuta las tareas que sus campos se cumplan en ese preciso minuto.
 
 
En algunas distribuciones cuando se editan crontabs de usuarios normales es necesario reiniciar el servicio para que se puedan releer los archivos de crontab en ''/var/spool/cron''.
 
<syntaxhighlight lang="bash">
 
#> service crond restart
 
</syntaxhighlight>
 
 
=== Ejemplos ===
 
Por ejemplo:
 
:<syntaxhighlight lang="bash">30 10 * * 1 /usr/bin/who >> /home/quien.tex</syntaxhighlight>
 
Ejecuta la orden '''who''' todos los lunes a las '''10:30''' y guarda la salida en el fichero ''quien.tex''
 
 
Para especificar dos o más valores en cada variable, estas deben estar separadas por comas, siguiendo con el ejemplo anterior:
 
:<syntaxhighlight lang="bash">0,30 * * * 1 /usr/bin/who >> /home/quien.tex</syntaxhighlight>
 
Ejecuta la orden who todos los lunes cada media hora y guarda la salida en el fichero ''quien.tex''
 
 
Si queremos que se ejecute cada 15 minutos sería
 
:<syntaxhighlight lang="bash">0,15,30,45 * * * * /usr/bin/who >> /home/quien.tex</syntaxhighlight>
 
o
 
:<syntaxhighlight lang="bash">*/15 * * * * /usr/bin/who >> /home/quien.tex</syntaxhighlight>
 
 
En este ejemplo veremos como pasarle más de un comando al cron y de paso como puede programarse una descarga:
 
:<syntaxhighlight lang="bash">30 21  * * *  cd /media/sda7/dexter/distributions/isos;wget http://example.com/fichero_a_descargar.loquesea</syntaxhighlight>
 
 
Este otro es para programar el apagado del PC. En este caso todos los sábados a las 21.30
 
 
:<syntaxhighlight lang="bash">30 21  * * 6  /sbin/shutdown -h now</syntaxhighlight>
 
 
'''Editar crontab de un usuario en particular'''
 
 
crontab [ -u usuario ] fichero
 
 
crontab [ -u usuario ] { -l | -r | -e }
 
 
La opción -u se utiliza para indicar el crontab de usuario que queremos administrar.
 
Sólo root podrá usar la orden crontab con esta opción.
 
 
La opción -e se utiliza para editarlo
 
 
 
===Definición de horarios predefinidos===
 
 
Hay varios valores predefinidos que se pueden utilizar para sustituir la expresión CRON.
 
Hay varios valores predefinidos que se pueden utilizar para sustituir la expresión CRON.
  
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
!Entrada                 !!Descripción                     !!Equivale A   
+
!Entrada !!Descripción !!Equivale A   
 
|-
 
|-
|<code>@yearly</code>    ||Se ejecuta una vez al año       ||<code>0 0 1 1 *</code>
+
|@yearly || Se ejecuta una vez al año || 0 0 1 1 *
 
|-
 
|-
|<code>@annually</code>  ||(igual que <code>@yearly</code>) ||<code>0 0 1 1 *</code>
+
|@annually ||(igual que @yearly) || 0 0 1 1 *
 
|-
 
|-
|<code>@monthly</code>  ||Se ejecuta una vez al mes       ||<code>0 0 1 * *</code>
+
|@monthly ||Se ejecuta una vez al mes || 0 0 1 * *
 
|-
 
|-
|<code>@weekly</code>    ||Se ejecuta una vez a la semana   ||<code>0 0 * * 0</code>
+
|@weekly ||Se ejecuta una vez a la semana || 0 0 * * 0
 
|-
 
|-
|<code>@daily</code>    ||Se ejecuta una vez al día       ||<code>0 0 * * *</code>
+
|@daily ||Se ejecuta una vez al día || 0 0 * * *
 
|-
 
|-
|<code>@midnight</code>  ||(igual que <code>@daily</code>) ||<code>0 0 * * *</code>
+
|@midnight ||(igual que @daily) || 0 0 * * *
 
|-
 
|-
|<code>@hourly</code>    ||Se ejecuta una vez cada hora     ||<code>0 * * * *</code>
+
|@hourly ||Se ejecuta una vez cada hora || 0 * * * *
 
|}
 
|}
  
También esta disponible <code>@reboot</code>, que permite a un trabajo ejecutarse una vez cada vez que el demonio cron se inicie, que eso tipìcamente coincidirá con el arranque del servidor. Puede ser útili si es necesario levantar un servidor o demonio bajo un usuario en particular o si el usuario no tiene permisos al archivo ''rc.d/init.d''.
+
También esta disponible @reboot, que permite a un trabajo ejecutarse una vez cada vez que el demonio cron se inicie, que eso típicamente coincidirá con el arranque del servidor.
 
 
  
 
=== Manipulación de Zonas horarias (Timezone) ===
 
=== Manipulación de Zonas horarias (Timezone) ===
Línea 256: Línea 143:
  
 
== Referencias ==
 
== Referencias ==
{{listaref}}
+
 
 +
<references/>
  
 
== Enlaces externos ==
 
== Enlaces externos ==
* [http://www.linuxtotal.com.mx/index.php?cont=info_admon_006 Manual de Cron][[Categoría:Software para Linux]][[Categoría:Software]]
+
 
 +
* [http://www.linuxtotal.com.mx/index.php?cont=info_admon_006 Manual de Cron]
 +
 
 +
[[Category:Software]][[Category:Software_para_Linux]]

última versión al 11:17 18 ago 2011

cron
Información sobre la plantilla
Sistemas Operativos compatiblesUnix

cron. Es un administrador regular de procesos en segundo plano para sistemas operativos de tipo Unix que ejecuta procesos a intervalos regulares. Es comúnmente utilizado para automatizar procesos como mantenimientos de sistema o administración o para iniciar scripts que deben ser ejecutados cada cierto tiempo.

Vista General

Cron es impulsado por un cron, un archivo de configuraciòn que especifica comando shell para ejecutarse periòdicamente a una hora especifica. Los archivos crontab son almacenados en donde pemanecen las listas de trabajos y otras instrucciones para el demonio cron. Los usuarios habilitados para crear su fichero crontab se especifican en el fichero cron.allow. De manera análoga, los que no lo tienen permitido figuran en /etc/cron.d/cron.deny, o /etc/cron.deny, dependiendo de la versión de Unix.

Cada lìnea de un archivo contab representa un trabajo y es compuesto por una expresion CRON, seguida por un comando shell para ejecutarse. Algunas implementaciones de cron, tal como en la popular BSD 4a edición escrita por Paul Vixie, e incluido en muchas distribuciones Linux, agrega una especificaciòn de nombre de usuario dentro del formato como un sexto campo, como quièn ejecutará el trabajo especificado (sujeto a la existencia de un usuario en /etc/passwd y permisos autorizados). Esto solo es permitido en el sistema contab (/etc/crontab and /etc/cron.d/*), no en otros donde son asiganados cada usuario es asignado a una configuración.

Para el "día de la semana" (campo 5), ambos 0 y 7, son considerados Domingo, através de algunas versiones de Unix tal como AIX no toma como vàlido el "7" en el man. Mientras que cuando el trabajo es ejecutado normalmente cuando fueron especificados los campos tiempo/fecha, todos coinsiden con la hora y fecha actual, esto es una excepción.

Si ambos "día del mes" y "día de la semana" son restringidos (no " * " ), entonces tampoco el "día del mes" (campo 3) o el "día de la semana" (campo 5) debe coincidir con el día actual.

Historia

Primeras versiones

Cron en Unix versión7, escrita por Brian Kernighan, fue un sistema de servicio (después llamado demonio) invocado de /etc/inittab cuando el {{Sistema_operativo|S.O.]] entròen modo multiusuario. Este algoritmo fue sencillo:

  1. Leer /usr/etc/crontab
  2. Determinar si algún comando se estaba ejecutando en la fecha y hora actul, y si se ejecutaba como Root.
  3. Suspender por un minuto
  4. Repetir paso 1.

Esta versión de cron fue básica y robusta, pero también consumió recursos si encontraba algún trabajo que hacer o no; al escuchar esta descripción, Douglas Comer, un profesor de la Universidad Purdue, remarcó, "Ah, un algorítmo de poca memoria.". En un experimento en la Universidad Purdue pasados los 1970s para extender los servicios de cron a todos los 100 usuarios sobre un tiempo compartido VAX que fue situadoen un lugar de mucha carga del sistema.

Capacidad Multi-usuario

La siguiente versión de cron, con la liberación System V, fue creada para extender las capacidades de cron para todos los usuarios de un sistema Unix, no solo root (o superusuario). Aunque esto hoy puede ser trivial con la mayoría de Unix y sistemas tipo Unix con procesadores potentes y un número pequeño de usuarios , al momento que requiere un nuevo enfoque sobre un sistema 1MIPS teniendo al rededor de 100 cuentas de usuario.

Versiones Modernas

Con la ventaja del proyecto GNU y Linux, apareció un nuevo cron. Lo más relevante de este es el cron Vixie, originalmente codificado por Paul Vixie en 1987. Versión 3 de cron Vixie fue liberado después de 1993. Versión 4.1 fue renombrada como Cron ISC (Consorcio de Sistema de Internet) y fue liberado en Enero del 2004. Versión 3, con unas mínimas correcciones de error, es usadd en la mayoría de las distribuciones de Linux y BSDs.

En 2007, RedHat bifucó cron-vixie 4.1 al proyecto cronie e incluyó anacron 2.3 en 2009.

Otra implementación popular incluye anacron y fcron. De cualquier forma, anacron no es un programa cron independiente; se basa en otro programa cron para llamarlo en orden para ejecutarse.

Formato del fichero crontab

Fichero crontab de ejemplo:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root nice -n 19 run-parts /etc/cron.hourly
50 0 * * * root nice -n 19 run-parts /etc/cron.daily
22 4 * * 0 root nice -n 19 run-parts /etc/cron.weekly
42 4 1 * * root nice -n 19 run-parts /etc/cron.monthly

Para agregar, quitar o modificar tareas, hay que editar el crontab. Esto se hace con la orden crontab -e, que abrirá el editor definido en la variable de entorno EDITOR y cargará el fichero crontab correspondiente al usuario que está logueado.

Las primeras cuatro líneas son variables que indican lo siguiente:

SHELL es el 'shell' bajo el cual se ejecuta el cron. Si no se especifica, se tomará por defecto el indicado en la línea /etc/passwd correspondiente al usuario que este ejecutando cron.

PATH contiene o indica la ruta a los directorios en los cuales cron buscará el comando a ejecutar. Este path es distinto al path global del sistema o del usuario.

MAIL TO es a quien se le envía la salida del comando (si es que este tiene alguna salida). Cron enviará un correo a quien se especifique en este variable, es decir, debe ser un usuario válido del sistema o de algún otro sistema. Si no se especifica, entonces cron enviará el correo al usuario propietario del comando que se ejecuta.

HOME es el directorio raíz o principal del comando cron, si no se indica entonces, la raíz será la que se indique en el archivo /etc/passwd correspondiente al usuario que ejecuta cron.


Sintaxis

El formato de configuración de cron es muy sencillo.

El momento de ejecución se especifica de acuerdo con la siguiente tabla:

  • Minutos: (0-59)
  • Horas: (0-23)
  • Días: (1-31)
  • Mes: (1-12)
  • Día de la semana: (0-6), siendo 1=lunes, 2=martes,... 6=sábado y 0=domingo (a veces también 7=domingo)
minuto (0-59),
|   hora (0-23),
|   |  día del mes (1-31),
|   |  |  mes (1-12),
|   |  |  |  día de la semana (0-6 donde 0=Domingo)
|   |  |  |  |       comandos
15 02  *  *  *
  • Para especificar todos los valores posibles de una variable se utiliza un asterisco (*).
  • La última columna corresponde a la ruta absoluta del binario o script que se quiere ejecutar.

Definición de horarios predefinidos

Hay varios valores predefinidos que se pueden utilizar para sustituir la expresión CRON.

Entrada Descripción Equivale A
@yearly Se ejecuta una vez al año 0 0 1 1 *
@annually (igual que @yearly) 0 0 1 1 *
@monthly Se ejecuta una vez al mes 0 0 1 * *
@weekly Se ejecuta una vez a la semana 0 0 * * 0
@daily Se ejecuta una vez al día 0 0 * * *
@midnight (igual que @daily) 0 0 * * *
@hourly Se ejecuta una vez cada hora 0 * * * *

También esta disponible @reboot, que permite a un trabajo ejecutarse una vez cada vez que el demonio cron se inicie, que eso típicamente coincidirá con el arranque del servidor.

Manipulación de Zonas horarias (Timezone)

Muchas implementaciones cron simplemente interpretan entradas crontab en la configuración del sistema de zona horaria en virtud de lo que establece el demonio al ejecutarse. Esto puede ser el origen de conflictos si grandes equipos multiusuarios tienen usuarios en varias zonas horarias, especialmente si el sistema de zona horaria predefinada incluye el confusor potencial DST. Por lo tanto una implementación cron puede tener cualquier caso especial "TZ=<timezone>" variable de entorno ajustando líneas en el usuario contab, interpretando entradas relativas crontab posterioresres a la zona horaria.[1]

Referencias

Enlaces externos