Como añadir tareas al cron

Muchas de las tareas de administración de un servidor se realizan repetida y periódicamente. 
Actualizar los logs, por ejemplo, es una labor que debemos hacer para asegurar el buen funcionamiento del servidor. Por este motivo, es importante conocer alguna herramienta que nos permita realizar estas tareas automáticamente. 

Si trabajas con Linux o en la administración de algún sistema Unix y quieres conocer un poco más del tema, en este artículo hablaremos del Cron y cómo automatizar tareas en Linux.

El demonio Cron (Daemon) 
Cron es una de las herramientas más útiles de Linux o en otros sistemas operativos Unix. El Servicio Cron
(Demonio) se ejecuta en segundo plano y comprueba constantemente que el archivo “/etc/crotab” y
directorios “/etc/cron .*/” y “/var/spool/cron/” no tengan tareas pendientes de ejecutar...
Los Cron Jobs (tareas) son usados para programar comandos que se ejecutarán periódicamente. Puede que
sean comando de configuración o scripts, los cuales serán ejecutados en un tiempo predefinido.
Cron es un utilitario de Linux que permite ejecutar tareas en background, a intervalos regulares de tiempo.
Para esto hace uso de un archivo llamado Crontab (de Cron Table), que contiene las entradas que deberán
ejecutarse según una hora y días determinados.
¿Cómo configurar el Cron?Existen dos tipos de configuración del Cron:
El crontab del sistema Unix/Linux: Usualmente son usados por los servicios del sistema y las tareas
críticas requieres de privilegios de root. El sexto campo (ver las descripción de campos) es el nombre
del usuario por el que un comando se ejecuta. Esto da la posibilidad de que el crontab pueda ejecutar
comandos como cualquier usuario.
Los crontabs del usuario: Cada usuario tiene su propio crontab y los comandos serán ejecutados con
los permisos del usuario que es dueño del crontab. El sexto campo es el comando a ejecutar. Por
defecto, todos los comandos son ejecutados como si los hiciera el usuario que creó el crontab.
¿Cómo Instalar / Crear / Editar mis propios Cronjobs?
Para editar el archivo crontab, hay que escribir lo siguiente en el prompt shell de Linux / Unix.
$ crontab –e
Sintaxis del Crontab (Descripción de campos)
Un cron job del usuario consta de seis campos y luce como la siguiente línea:
1 2 3 4 5 /path/to/command arg1 arg2
o
1 2 3 4 5 /root/backup.sh
Donde:
1: Minuto (0-59)
2: Horas (0-23)
3: Día (0-31)
4: Mes (0-12 [12 == diciembre])
5: Día de la semana (0-7 [7 or 0 == domingo])
/path/to/command – Ruta del script o comando a programar
* * * * * comando a ejecutar
- - - - -
| | | | || | | | ----- Día de la semana (0 - 7) (Domingo=0 o 7)
| | | ------- Mes (1 - 12)
| | --------- Día del mes (1 - 31)
| ----------- Hora (0 - 23)
------------- Minuto (0 - 59)
Un cron job del sistema luce como la siguiente línea:
1 2 3 4 5 USERNAME /path/to/command arg1 arg2
o
1 2 3 4 5 USERNAME /path/to/script.sh
Añadimos el nombre del usuario que ejecutará el comando.
Ejemplo: Automatizar tareas de backups
Si deseamos que un script llamado /root/backup.sh corra todos los días a las 3am, debemos ingresar al
crontab de la siguiente manera:
$ crontab –e
Y añadir al final del archivo la siguiente línea:
0 3 * * * /root/backup.sh
Luego, guardamos y cerramos el archivo crontab.
Más ejemplos
Para ejecutar /path/to/command cinco minutos después de la medianoche, todos los días, añadimos:
5 0 * * * /path/to/command
Para ejecutar /path/to/script.sh a las 2:15px el primer día de cada mes, añadimos:
15 14 1 * * /path/to/script.sh
Para ejecutar el /scripts/phpscripts.php a las 10pm de lunes a viernes, añadimos:0 22 * * 1-5 /scripts/phpscript.php
Para ejecutar /root/scripts/perl/perlscript.pl transcurridos 23 minutos después de la medianoche, 2am, 4am
..., todos los días, añadimos:
23 0-23/2 * * * /root/scripts/perl/perlscript.pl
Para ejecutar /path/to/unixcommand 5 minutos después de las 4am cada domingo, añadimos:
5 4 * * sun /path/to/unixcommand
¿Cómo usar los operadores?
Un operador nos permite especificar múltiples valores en un campo. Existen tres operadores:
1. El asterisco (*): Este operador abarca a todos los valores posibles en un campo. Por ejemplo,
un asterisco en el campo de hora, será equivalente a cada hora; o, un asterisco en el campo
mes será equivalente a cada uno de los meses.
2. La coma (,): Este operador especifica una lista de valores, por ejemplo: "1,5,10,15,20, 25".
3. El guión (-): Este operador especifica una serie de valores, por ejemplo: ""5-15" días, lo que
equivale a escribir "5,6,7,8,9, ... ,13,14,15" usando el operador coma.
Cosas que debes saber de los Cron Jobs Linux
Estos son algunos datos a tener en cuentas a la hora de automatizar tareas con el Cron de Linux.
¿Cómo deshabilitar el envío de emails?
Por defecto, la salida de un comando o script (output, si los hubiera) será el envío de un correo electrónico a
nuestra bandeja de entrada local. Para dejar de recibir emails de salida del crontab necesitamos añadir
“>/dev/null 2>&1” al final de la línea.
0 3 * * * /root/backup.sh >/dev/null 2>&1
Para enviar la salida a una cuenta de correo electrónico en particular, por ejemplo
baluart@midominio.com, es necesario definir la variable MAILTO en la tarea del cron:
MAILTO="baluart@midominio.com"0 3 * * * /root/backup.sh >/dev/null 2>&1
¿Cómo listar todos tus tareas del crontab?
Escribiendo el siguiente comando:
# crontab -l
# crontab -u username -l
¿Cómo listar todos tus tareas del crontab?
Para suprimir todas las tareas del crontab usamos el siguiente comando:
# crontab -r
# crontab -r -u username
¿Cómo ahorrar tiempo usando una cadena de texto?
En lugar de los cinco primeros campos, podemos utilizar cualquiera de las ocho cadenas de texto que a
continuación vemos. No sólo nos ahorrará tiempo, sino que mejorará la legibilidad.
Cadena especial Significado
@reboot Ejecutar una vez, en el inicio.
@yearly Ejecutar una vez al año, "0 0 1 1 *".
@annually (igual que @yearly)
@monthly Ejecutar una vez al mes, "0 0 1 * *".
@weekly Ejecutar una vez a la semana, "0 0 * * 0".
@daily Ejecutar una vez al día, "0 0 * * *".
@midnight (igual que @daily)
@hourly Ejecutar a cada hora, "0 * * * *".Ejemplos de uso
Ejecutar el comando ntpdate cada hora:
@hourly /path/to/ntpdate
Hacer un back todos los días:
@daily /path/to/backup/script.sh
El archivo /etc/crontab y los directorios /etc/cron.d/*
“/etc/crontab” es el archivo del sistema de crontabs. Por lo general, es usado por el usuario root o demonios
del sistema para configurar las tareas del sistema. Todos los usuarios deben usar el comando crontab para
instalar y editar sus tareas, como hemos visto en este artículo. “/var/spool/cron/” o “/var/cron/tabs/” es el
directorio para almacenar los archivos crontab personales del usuario.
El archivo /etc/crontab por defecto
Por lo general, el fichero “/etc/crontab” viene con las siguientes directivas:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
La definición de las variables SHELL y PATH sirven para indicar al demonio qué intérprete de comandos debe
utilizar y cuál será su PATH. La variable MAILTO, define el usuario por defecto que será notificado en caso
halla un output, luego de ejecutar el cron. Y si la variable HOME no es definida, el cron usará el directorio de
los usuarios que lo invocan.
Adicionalmente, Cron lee los archivos del directorio “/etc/cron.d/”. Por lo general, distintos daemonscolocan sus cron jobs aquí. Como superusuario uno puede usar los siguientes directorios para configurar
cronjobs y adaptarlos a nuestras necesidades. El comando “run-parts” ejecuta scripts o programas en un
directorio vía “/etc/crontab”. Veamos los directorios:
Directorio Descripción
/etc/cron.d/ Poner todos los scripts aquí y llamarlos desde /etc/crontab file.
/etc/cron.daily/ Ejecutar todos los scripts una vez al día
/etc/cron.hourly/ Ejecutar todos los scripts cada hora
/etc/cron.monthly/ Ejecutar todos los scripts una vez al mes
/etc/cron.weekly/ Ejecutar todos los scripts una vez a la semana
¿Cómo se utiliza encima de directorios para poner mis scripts?
Este es un shell script (clean.cache) para limpiar los archivos almacenados en la caché cada 10 días. Este
script se crea directamente en el directorio “/etc/cron.daily/”, por ejemplo: “/etc/cron.daily/clean.cache”:
#!/bin/bash
# Un shell script de ejemplo para limpiar
# archivos de la cache de un servidor web lighttpd
CROOT="/tmp/cachelighttpd/"
DAYS=10
LUSER="lighttpd"
LGROUP="lighttpd" # empezar limpieza<br>/usr/bin/find ${CROOT} -
type f -mtime +${DAYS} | xargs -r /bin/rm # si el directorio es
borrado por algún otro script, regresar
if [ ! -d $CROOT ]
then
/bin/mkdir -p $CROOT
/bin/chown ${LUSER}:${LGROUP} ${CROOT}
fi

Comentarios