Como agregar tareas al Cron de Linux

Que es Cron

Para poder automatizar tareas sobre sistemas Linux/Unix se utiliza la herramienta Cron. Comunmente se utiliza para sacar copias de seguridad (backups) de archivos, o una tarea que debe de ser ejecutada en un horario especifico. Como ejemplo les puedo mencionar que este sitio realiza un backup de su base de datos diariamente en un horario donde estadisticamente no hay muchas visitas para luego mandar ese backup por medio de scp a otro servidor remoto, y todo esto con una tarea asginada en el cron.

Como funciona el Cron

A decir verdad, no existe un programa llamado cron, lo que si existe es el programa crontab y el demonio crond. Entonces,

Con el programa crontab ingresamos los comandos en un archivo de texto, los cuales seran guardados automaticamente en el directorio /var/spool/cron/crontabs. Por ejemplo para el usuariox sus tareas del cron se guardan en /var/spool/cron/crontabs/usuariox.

El demonio crond lee periodicamente los archivos del crontab y ejecuta los comandos guardados dentro de esos archivos en el horario que fueron programados.

La interfaz del crontab viene distribuida de la siguiente manera:

Seis columnas m h dom mon dow command, las cuales no siempre se muestran en el crontab del usuario.

Columnas del crontab

mminutos 0-59
hhoras 0-23
dom dia del mes 1-31
monmes 1-12(o nombre del mes en ingles, como jan, feb, etc)
dowdia de la semana 0-6siendo 0 el dia domingo
commandEl comando que sera ejecutado

Como ejemplo podemos pensar en:

0 1 24 5 0 /scripts/comando.sh

La linea anterior correra el comando a la 1:00AM, el dia lunes 24 de Mayo. Que es lo mismo si lo escribimos asi:

0 1 24 may mon /scripts/comando.sh

Ahora bien, que pasa si queremos correr un comando cada hora sin importar la fecha? Un asterisco * es interpretado por el cron como ejecutar el comando especificado toda vez que sea posible segun la columna. Asi que para correr un comando automaticamente via cron cada hora, escribimos en el crontab lo siguiente:

0 * * * * /scripts/comando.sh

Lo cual sera ejecutado todos los dias, cada hora en el minuto 0, en otras palabras a la hora en punto.

Esto permite especificar una variacion de los campos. Digamos que necesitamos ejecutar un comando cada dos horas, para esto escribimos en el campo de hora */2, lo cual sera ejecutado a las 2, 4, 6, 8 etc.

Tambien es posible la utilizacion de comas para indicar la ejecucion mas de una vez. Digamos que queremos ejecutar el comando treinta minutos despues de la hora en punto, y luego cuarenta y cinco minutos despues. Especificamos en el campo minuto asi: 30,45.

Si se escribe un gion – entre dos valores, esto incluira todos los valores en ese intervalo de tiempo. Como ejemplo podemos imaginar correr un comando la primera semana del mes. Con este fin en el dia del mes escribimos: 1-7.

Asi que para correr el comando cada 2 horas, treinta minutos despues de la hora en punto y quince minutos antes de la siguiente hora en punto durante los 7 primeros dias del mes, escribimos en el crontab:

30,45 */2 1-7 * * /scripts/comando.sh

Para guardar la salida del comando en un archivo de texto, podemos escribirlo asi en el crontab:

0 * * * * /scripts/comando.sh >> /home/user/crontab.log

Por default, la salida es enviada por correo a la cuenta del administrador del sistema, para evitarnos esto agregamos lo siguiente al comando:

0 * * * * /scripts/comando.sh >> /home/user/crontab.log 2>&1

Igualmente, si no se requiere ninguna salida del comando, esta puede ser redirigida a /www.null:

0 * * * * /scripts/comando.sh >> /www.null 2>&1

Obviamente la idea del cron es tener alguna informacion de lo que ha ejecutado, de lo contrario es bastante inutil. Pero a veces esta de mas tener guardada la misma informacion.

Creo que se me habia olvidado mencionar la forma de usar crontab para hacer que crond ejecute nuestros comandos. Para crear o editar las entradas del cron, utilizamos el comando crontab -e, lo cual abrira un editor de texto en el cual podemos agregar las entradas al cron, una por linea.

El comando crontab -e ejecuta vi por default. Si se quiere utilizar otro editor de texto se puede cambiar la variable de entorno VISUAL.

deathbian:~# export VISUAL='pico -w'

Para ver todas las entradas creadas en el cron tecleamos el siguiente comando:

deathbian:~# crontab -l

Si queremos borrar todas las entradas al crontab de un usuario tecleamos crontab -r, con el usuario que deseamos borrar sus entradas en el cron.

Nota: El superusuario root puede editar los crontabs de otros usuarios tecleando: crontab -e -u usuario

Tambien es posible correr todos los scripts en un mismo directorio a una hora determinada, agregando una entrada como la siguiente en el crontab

0 * * * * run-parts /scripts/hour.cron/

Pueden encontrar mas ejemplos como este en /etc/crontab.

Como siempre, sus dudas y sugerencias son bienvenidas….!!

Actualizacion

Ejecutar cron en Solaris 10

Para poder agregar o simplemente editar un trabajo en el cron de Solaris 10, debemos exportar la variable de UNIX indicando el editor que abrira el archivo de crontab, tecleando:

export EDITOR=vi

25 comments

  1. Muy buena reseña de uso del crontab y la explicación es bastante fácil de comprender.

    Tenía algún conocimiento del uso del crontab pero no conocía hasta ahora todas las combinaciones que se pueden hacer, me pareció muy útil la de correr el script dentro de un rango de tiempo (como el ejemplo de hacerlo la primera semana).

    Gracias por publicarlo.

    Saludos.

    1. Luego de crear un cron, este es ejecutado automaticamente por el Scheduler del kernel de linux. Claro que es posible ejecutar un *.php via cron, lo que hay que tener cuidado es a donde se dirige la salida del mismo.

      Por ejemplo, yo tengo un monitor de enlaces el cual esta hecho en php para poder ser desplegado en el navegador. Pero el mismo se tiene que ejecutar cada tres minutos automaticamente, por lo que he creado una tarea en el cron, de la siguiente manera:

      */3 9-18 * * 0-5 wget -O /dev/null > /dev/null 2>&#038;1<br />

  2. hola quisiera saber como hacer con cron para que cada dia lunes a las 4 pm se cree una copia de respaldo de mis archivos de configuracion como el fstab, xorg.conf

  3. AYUDA URGENTE, AYUDA URGENTE, AYUDA URGENTE, AYUDA URGENTE, AYUDA URGENTE,

    Por favor necesito saber como obtener la hora de un dispositivo conectado a mi equipo (con red hat linux) a través de un puerto serial RS232. Por favor necesito su ayuda, ya logre que haya comunicacion pero no logro que la hora del sistema se obtenga del dispositivo conectado a través de dicho puerto.

    El punto, es que el horario del equipo debe ser obtenido de un dispositivo controlador de horario (Arbiter System 1093-C), de tal forma que al cambiar el horario de la maquina, automaticamente se actualiza y tome el horario proporcionado por el dispositivo.

    POR FAVOR ALGUN EXPERTO QUE ME AYUDE, SOY PRIMERIZO EN LINUX

    MIL GRACIAS

    Les dejo mi correo por si alguien me puede ayudar

    hem18_86hotmail.com

  4. bueno a mi no me anda veamos quiero hacer correr un script q esta en home se llama cron y esta es la linea q agregue en #crontab -e
    28 17 ** 1-5 root /home/orfeos/cron.sh

    en fin no me corre?

  5. En Debian Crontab no ejecuta mi script.
    Si funciona el script en forma manual
    Esta distro algo tiene diferente… alguna idea?

  6. Hola, tengo un shell que corre estadisticas de las tablas de mi BD .. lo he agregado con crontab -e:
    [[email protected] spool]$ crontab -l
    12 01 * * * /home/oracle/crontab/statistics_tables.sh
    cuando reviso el log me sale lo siguiente:
    Date: Sat, 12 Sep 2009 01:12:01 -0500
    Message-Id:
    From: [email protected] (Cron Daemon)
    To: [email protected]
    Subject: Cron /home/oracle/crontab/statistics_tables.sh
    X-Cron-Env:
    X-Cron-Env:
    X-Cron-Env:
    X-Cron-Env:
    X-Cron-Env:

    /home/oracle/crontab/statistics_tables.sh: line 2: sqlplus: command not found
    mis variables de entorno en el .bash_profile son:

    export ORACLE_BASE=/u01/app/oracle
    export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1
    export PATH=$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/OPatch

    al parecer no reconoce el comando sqlplus … pero si lo he agregado al PATH .. que es lo que no estoy viendo???

  7. conchale necesito una ayuda saludos primero q todo,!! yo tengo mi servidor Squid proxy en debian-linux, pero como hago para hacer el borrado de la cache para no hacer esta tarea manual sino que la haga automaticamente mi sistema

  8. CORRECCIÓN:

    Para programar días de la semana en crontab, deberá escribirse un número entre 0 y 6, donde 0 es el primer día de la semana o sea domingo, ¡¡¡DOMINGO!!!

    NOTA:
    Les recomiendo que tomen sus precauciones cuando lean este blog, por mi parte nunca más lo volveré a visitar.

  9. Una Pregunta:

    Quisiera sacar un Backup de mi Base de datos completa llamada prueba todos los dias a las 3 am a traves de cron, cual seria la instruccion que deberia colocar.

    Gracias por la respuesta

  10. Tengo un problema en la ejecución de un shell atravez del cron ..lo tengo calendarizado para que se ejecute de lunes a viernes a las 13:34 … si lo ejecuta pero al utilizar la variable del date para generar mi archivo me pones 6 horas de mas… por que ???

    34 13 * * 1,2,3,4,5 /export/home/mqm/soportemq/CHECKLIST_MQ.sh

    Nombre del archivo generado:
    VALIDACION_VESP_11-02-2011_19:34.txt

  11. Hola porfavor me pueden colaborar con lo siguiente.
    necesito realizar un cron que me diga cuales ip de las que ya tengo asignadas a un canal estan pasando por el , necesito que la informacion me la envie a un archivo plano…
    si alguien sabe, le agradezco la ayuda que me pueda brindar ya que no se como se hace y necesito realizarlo lo más pronto posible

  12. Hola a todos necesito saber como puedo comprimir las salvas de mi servidor proxy mediante el comando compress
    la sintaxis es la siguiente vzdump –dumpdir /var/lib/vz/private compress 103 pero me da un error

  13. Como ejemplo podemos pensar en:
    0 1 24 5 0 /scripts/comando.sh
    La linea anterior correra el comando a la 1:00AM, el dia lunes 24 de Mayo.
    si 0 es domingo >> el día es lunes!
    Saludos

Comentario, Preguntas o agradecimientos?