domingo, 20 de enero de 2013

Programar tareas en Linux usando crontab


Linux tiene un gran programa llamado cron. Esto permite que las tareas que se ejecutan automáticamente en segundo plano a intervalos regulares. También puede usarlo para crear automáticamente copias de seguridad, sincronizar archivos, programar actualizaciones y mucho más. Bienvenido al maravilloso mundo de crontab. Editando crontab!!
 .

Crontab

El crontab (cron deriva de Cronos, en griego que significa "tiempo") de comandos, que se encuentra en sistemas operativos Unix, se utiliza para programar la ejecución de comandos de forma periódica.
Para ver los crontabs que se están ejecutando actualmente en su sistema, puede abrir un terminal y ejecutar:


crontab -l
Para editar la lista de cronjobs puede ejecutar:


crontab -e 

Se abre con el editor por defecto el podría ser vi, nano o pico. Para cambiar el editor de crontab por defecto es necesario exportar la variable de ambiente EDITOR:


#su
passwd: 
#export EDITOR="nano"
          o
#export EDITOR="vi"

Con el comando anterior cambiamos el editor de crontab, nuevamente volvermos agregar tareas en crontab, se guarde y sale del editor. Los cronjobs se escriben en el siguiente formato:




* * * * * /bin/execute/this/script.sh 



Como puedes ver hay 5 estrellas. Las estrellas representan las diferentes partes de fecha en el siguiente orden:
minutos: (de 0 a 59)
horas: (de 0 a 23)
día del mes: (del 1 al 31)
mes: (de 1 a 12)
días de semana: (de 0 a 6) (0 = domingo)

Ejecutar cada minuto

Si deja el asterisco significa cada minuto. Tal vez es un poco confuso. Vamos a usar el ejemplo siguiente:




* * * * * /home/usuario/script.sh 
Todos ellos son todavía asteriscos! Así que esto significa ejecutar /home/usuario/script.sh:
cada minuto
de cada hora
de cada día del mes
de cada mes
y todos los días de la semana.

En resumen: Este script se ejecuta cada minuto. Sin excepción.

Ejecutar cada Viernes a las 1 AM

Así que si desea programar la secuencia de comandos para ejecutar todos los viernes a la 1AM, necesitaríamos el cronjob siguiente:




0 1 * * 5 /home/usuario/script.sh 

¿Lo entiendes? Esta tarea se ejecutara cuando el reloj del sistema marque:
minuto: 0
de hora: 1
de días del mes: * (todos los días del mes)
del mes: * (cada mes)
y día de la semana: 5 (= Viernes)


Ejecutar los días laborables a las 1 a.m.

Si queremos programar una tarea en el crontab que se ejecute de lunes a viernes y a las 1 am, necesitaríamos editar el siguiente cronjob:




0 1 * * 1-5 /home/usuario/script.sh 

Lo entiendes? La Tarea está siendo ejecutada cuando el reloj del sistema marca:
el minuto: 0
de hora: 1
de días del mes: * (todos los días del mes)
del mes: * (cada mes)
y día de la semana: 1-5 (= lunes hasta viernes)


Ejecutar una tarea pasado 10 min después de cada hora y el día 1 de cada mes





10 * 1 * * /home/usuario/script.sh 
Trucos en el crontab

¿Qué pasa si te gustaría ejecutar algo cada 10 minutos? Así que usted puede hacer esto:




0,10,20,30,40,50 * * * * /home/usuario/script.sh 

Pero crontab le permite hacer esto también:




*/10 * * * * /home/usuario/script.sh 
Palabras especiales en crontab

En crontab también se puede usar palabras clave en lugar de número:

  • @reboot       Ejecutar una vez en el arranque
  • @yearly        Ejecutar anual una vez al año        "0 0 1 1 *"
  • @annually     Lo mismo que (@yearl)
  • @monthly     Ejecutar una vez al mes                "0 0 1 * *"
  • @weekly      Ejecutar una vez por semana        "0 0 * * 0"
  • @daily          Ejecutar una vez al dia                 "0 0 * * *"
  • @midnight    Lo mismo de (@daily)
  • @hourly       Ejecutar una vez a la hora             "0 * * * *"

Deje el resto de los campos vacíos para que pueda ser válida, ejemplo:



@daily /home/usuario/script.sh 


Almacenamiento de la salida de crontab

Cron puede guarda la salida de /home/usuario/script.sh en el buzón del usuario (root en este caso). Pero es más bonito si la salida se guarda en un archivo de registro separado. He aquí cómo:




*/10 * * * * /home/usuario/script.sh >> /var/log/script_output.log 2>&1   

Linux puede informar acerca de los diferentes niveles. No hay salida estándar (stdout) y error estándar (stderr). STDOUT está marcado 1, STDERR se marca 2. Así que la siguiente declaración le dice a Linux para almacenar STDERR en STDOUT, así, la creación de un flujo de datos de los mensajes y errores:




2>&1  

Ahora que tenemos un flujo de salida, se puede almacenar en un archivo.
Dónde:
 > sobrescribirá el archivo.
 >> anexará al expediente.
En este caso nos gustaría anexar:




>> /var/log/script_output.lo 



Enviar por correo la salida de crontab

Cron guarda la salida en el buzón del usuario (root en este caso) del sistema local, pero también se puede configurar para reenviar todo el crontab a una dirección de correo electrónico:



MAILTO = "yourname@yourdomain.com"   


Enviar por correo la salida de crontab de un solo cronjob

Si prefiere recibir la salida de una sola tarea programada en su correo, asegúrese de que el paquete está instalado:



Instalar msmtp, ver link
apt-get install msmtp ca-certificates 
Luego de instalado cambiar el cronjob así:



*/10 * * * * /home/usuario/script.sh 2>&1 | mutt -s "Cronjob ouput" yourname@yourdomain.com  
o 

*/10 * * * * mutt -s "prueba desde la consola" yourname@yourdomain.com </var/log/auth.log

Enviar la salida de crontab a null

Eso es fácil:


*/10 * * * *  /home/usuario/script.sh > /dev/null 2>&1  
/dev/null es un archivo especial que descarta todos los datos escritos en ella.


Deshabilitar Crontab

Para borrar todas las tareas en cron solo necesita aplicar este comando:
Crontab -r 

Espero que les sirve estas informacion.

No hay comentarios:

Publicar un comentario