Como agregar tareas al Cron de Linux 26

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

m minutos 0-59
h horas 0-23
dom dia del mes 1-31
mon mes 1-12 (o nombre del mes en ingles, como jan, feb, etc)
dow dia de la semana 0-6 siendo 0 el dia domingo
command El 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

Terminos de busqueda

  • cron linux
  • crontab linux
  • linux cron
  • crontab examples
  • crontab linux ejemplos
  • cron en linux
  • linux crontab
  • crontab en linux
  • crontab ejemplos
  • crontab debian
  • 26 thoughts on “Como agregar tareas al Cron de Linux

    1. Reply Pepe Nov 13,2007 07:55

      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.

    2. Reply Joel Cristobal Feb 23,2008 08:59

      Gracias Por esta ayuda ami tambien me funciono ahora esta funcionando de marabilla

      —————————

    3. Reply ELENA SOLIS Feb 28,2008 18:16

      como se ejecuta un cron??, puedo ejecutar un archivo.php con un cron??.gracias

      • Reply fher98 Mar 4,2008 21:16

        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 <a href="http://monitores.guatewireless.com/enlaces/index.php" >http://monitores.guatewireless.com/enlaces/index.php</a> > /dev/null 2>&#038;1<br />

    4. Reply ignacio Jun 1,2008 22:07

      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

    5. Reply Marte2501 Jul 21,2008 10:00

      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

    6. Reply orfeos May 19,2009 16:57

      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?

    7. Reply orfeos May 19,2009 18:28

      entonces no deberia poner el usuario q va a ejecutar el script i ek crin mejor ducho deja lo pruebo?

      gracias!

    8. Reply Marcelo Jul 10,2009 12:18

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

    9. Reply Cat Sep 11,2009 21:16

      Hola, tengo un shell que corre estadisticas de las tablas de mi BD .. lo he agregado con crontab -e:
      [oracle@pcoracle 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: root@pcoracle.oracle (Cron Daemon)
      To: oracle@pcoracle.oracle
      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???

    10. Reply aallende Apr 2,2010 20:15

      muchas gracias por la explicacion de como utilizar crontab. necesitabaun buen manual para poder utilizarlo

    11. Reply andres isaac Apr 11,2010 15:05

      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

    12. Reply Mauricio May 31,2010 09:30

      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.

    13. Reply Yosip Jul 10,2010 11:56

      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

    14. Reply Confundido Feb 11,2011 13:31

      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

    15. Reply Alejandro Aguilar Jul 6,2011 08:34

      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

    16. Reply reiner Oct 2,2012 08:49

      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

    17. Reply acidb1 May 27,2014 08:26

      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?

    %d bloggers like this: