epelpad

Una guia de crontab

Antes que nada, que es cron?

El nombre cron viene del griego chronos que significa “tiempo”. En el sistema operativo Unix, cron es un administrador regular de procesos en segundo plano (demonio) que ejecuta procesos o 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 crontab.
Cron se podría definir como el “equivalente” a Tareas Programadas de Windows.

Como funciona cron

El demonio cron inicia de /etc/rc.d/ o /etc/init.d dependiendo de la distribucion. Cron se ejecuta en el background, revisa cada minuto la tabla de tareas crontab /etc/crontab o en /var/spool/cron en busqueda de tareas que se deban cumplir. Como usuario podemos agregar comandos o scripts con tareas a cron para automatizar algunos procesos. Esto es util por ejemplo para automatizar la actualizacion de un sistema o un buen sistema de respaldos (proximo post).

Que es Crontab

Crontab es un simple archivo de texto que guarda una lista de comandos a ejecutar en un tiempo especificado por el usuario. Crontab verificara la fecha y hora en que se debe ejecutar el script o el comando, los permisos de ejecutcion y lo realizara en el background. Cada usuario puede tener su propio archivo crontab, de hecho el /etc/crontab se asume que es el archivo crontab del usuario root, cuando los usuarios normales (e incluso root) desean generar su propio archivo de crontab, entonces utilizaremos el comando crontab.

Crontab es la manera mas sencilla de administrar tareas de cron en sistemas multiusuario, ya sea como simple usuario de sistema o usuario root.

Utilizando Crontab

Vamos empezando con un ejemplo simple.
Vamos a automatizar la actualizacion de un sistema, para eliminar la molesta de “siempre tengo que andar actualizando y eso no me gusta!”, vamos a solucionarle el problema a esas personitas de capacidades diferentes que batallan tanto haciendo una actualizacion….

Primero que nada haremos un script, este script sera llamado por cron y contendra todas las instrucciones que queremos que haga, por lo tanto es necesario probarlo en varios casos y de varias formas antes de incluirlo a cron, un sencillo script de actualizacion como este:

Script dijo:#!/bin/bash
#script ejemplo de actualizacion
#elija su distribucion
#debian-ubuntu
#apt-get update & ap-get -y upgrade
#fedora
#yum -y update
#Arch
pacman --noconfirm -Syu


Lo guardamos como actualizacion.sh (ej. directorio scripts tu home). Cambiamos los permisos de ejecucion del dichoso script con:

chmod a+x ~/scripts/actualizacion.sh


Ejecutamos el script un par de veces para verificar que todo ejecute sin problemas, modificamos lo necesario (no debe contener errores, si no cron solo repetira un error una y otra vez). Ahora a agregar la tarea a nuestro crontab.

Agregar tareas al crontab

Ejecutamos la edicion del crontab con crontab -e, en algunas distros (como ubuntu) nos da la opcion de ejegir el editor de textos que deseemos, los demas nos quedamos con vi, el archivo crontab lucira algo asi.

# m h dom mon dow user command

donde:

m corresponde al minuto en que se va a ejecutar el script, el valor va de 0 a 59
h la hora exacta, se maneja el formato de 24 horas, los valores van de 0 a 23, siendo 0 las 12:00 de la medianoche.
dom Hace referencia al dia del mes, por ejemplo se puede especificar 15 si se quiere ejecutar cada dia 15
dow Significa el dia de la semana, puede ser numerico (0 a 7, donde 0 y 7 son domingo) o las 3 primeras letras del dia en ingles: mon, tue, wed, thu, fri, sat, sun.
user Define el usuario que va a ejecuatr el comando, puede ser root, u otro usuairo diferente siempre y cuando tenga permisos de ejecucion del script.
command refiere al comando o a la ruta absoluta del script a ejecutar, ejemplo: /home/usuario/scripts/actualizar.sh, si acaso llama a un script este debe ser ejecutable

Para que quedara claro unos cuantos ejemplos de tareas de cron explicados:

15 10 * * * usuario /home/usuario/scripts/actualizar.sh

Ejecutara el script actualizar.sh a las 10:15 a.m. todos los dias

15 22 * * * usuario /home/usuario/scripts/actualizar.sh

Ejecutara el script actualizar.sh a las 10:15 p.m. todos los dias

00 10 * * 0 root apt-get -y update Usuario root

Ejecutara una actualizacion todos los domingos a las 10:00 a.m

45 10 * * sun root apt-get -y update

Usuario root ejecutara una actualizacion todos los domingos (sun) a las 10:45 a.m

30 7 20 11 * usuario /home/usuario/scripts/actualizar.sh

El dia 20 de noviembre a las 7:30 el usuario correra el script

30 7 11 11 sun usuario /home/usuario/scripts/pastel_con_velitas.sh

El dia 11 de noviembre a las 7:30 a.m. y que sea domingo, el usuario festejara a su sysadmin (o sea a mi)

01 * * * * usuario /home/usuario/scripts/molestorecordatorio.sh

Un molesto recordatorio cada minuto de cada hora todos los dias (NO recomendable).

Igual se pueden manejar rangos especiales:

30 17 * * 1,2,3,4,5

A las 5:30 de la tarde todos los dias de lunes a viernes.

00 12 1,15,28 * *

A las 12 del dia todos los dias primero, quince y 28 de cada mes (ideal para nominas)

Si esto resulta confuso, crontab maneja cadenas especiales para definir estos rangos.

@reboot Ejecuta una vez, al inicio
@yearly ejecuta solo una vez al año: 0 0 1 1 *
@annually igual que @yearly
@monthly ejecuta una vez al mes, el dia primero: 0 0 1 * *
@weekly Semanal el primer minuto de la primer horade la semana. 0 0 * * 0″.
@daily diario, a las 12:00A.M. 0 0 * * *
@midnight igual que @daily
@hourly al primer minuto de cada hora: 0 * * * *

Su uso es muy sencillo.

@hourly usuario /home/usuario/scripts/molestorecordatorio.sh
@monthly usuario /home/usuario/scripts/respaldo.sh
@daily root apt-get update && apt-get -y upgrade

Por ultimo y no menos importante:

Administracion de trabajos en cron

crontab archivo
Remplaza el existente archivo crontab con un archivo definido por el usuario

crontab -e
Editar el archivo crontab del usuario, cada linea nueva sera una nueva tarea de crontab.

crontab -l
Lista todas las tareas de crontab del usuario

crontab -d
Borra el crontab del usuario

crontab -c dir
Define el directoriod e crontab del usuario (este debe tener permisos de escritura y ejecucion del usuario)

crontab -u usuario
prefijo para manejar el crontab de otro usuario, ejemplos:
$ sudo crontab -l -u root
$ sudo crontab -e usuario2
#crontab -d -u usuario

Esta herramineta, como muchas otras se pueden ver a mas profundidad y con mas detalle en:
Manual cron
Manual crontab
Crontab en la wiki de ubuntu

Espero les sea util:

Sigue: rsync + cron + ssh = el sistema de respaldo perfecto

15 comentarios - Una guia de crontab

_ArS_
Capo leí lo primer parte, y creo que me va a servir, en estos dias tenia pensado interiorizarme con cron, te dejo mis 10
sGoico
Buena info .. mis 10 de hoy
gust55
Exelente Info para rsync. Saludos
gust55
Tenes idea, para hacer un cron de rsync. edito el #crontab -e . Agrego toda la sentencioa, pero cuando hago un backup me tengo que loggear con la contreseña de otro equipo. Como hago para automatizar eso con crontab. Debo crear alguna regla para que ambos equipos se conecten directamente?

muchas gracias
Auspiciador
Buena info, esto me ayuda para mi proyecto
luisunlock
Alto Post te mandaste Capo! Mañana te doy mis 10, Me sirvio muchisimo, a favoritos, recomendado y te sigo
luisunlock
Amigo lo prometido es deuda ahí te dejo mis 10 tal como te lo prometí
waltico +1
Puro COPY + PASTE en todos... porque no pueden explicar con sus palabras...
alexrecargado -5
TU POST NO SIRVE PARA UNA MIERDA, POR QUE NO LO COJES Y TE LO METES BIEN POR EL ORTO HIJO DE MIL ZORRAS
luistilan
@alexrecargado el hecho de que no te haya funcionado no es para ofender a los compañeros.., es que no supiste alplicar lo que que se te explico.., funciona pues es lo que hacemos los administradores de procesos linux... Saludos...
luistilan
@alexrecargado

Para que te funcione la explicación (si tu usuario es administrador o tienes permisos en /etc/cron.allow) desde tu home has un archivo llamado "alexrecargado" con las entradas que dice nuestro compañero.

Ejemplo:
1. Crear un archivo alexrecargado.cron (o cualquier nombre) con una entrada como la de este ejemplo que ejecuta un proceso "shellX" cada 59 minutos todos los dias.

59 * * * * /home/alexrecargado/shellX

lo guardas.


2. ejecutas crontab alexrecargado.cron <enter>

3. crontab -l <Enter>
Te muestra la programacion que hiciste.

Saludos y espero así si te funcione.
DooM3418 +1
Tremendo copy y paste, aca esta el post original:

http://blog.desdelinux.net/cron-crontab-explicados/

Slds