Usando cron para gestión de tareas programadas en Linux

Buenas a todos, como muchos de vosotros sabréis cuando nos encontramos con entornos Linux / Unix nuestro compañero para programar tareas de serie será Cron, y seguramente seguirá siéndolo durante mucho tiempo ya que su funcionamiento es impecable.
El archivo principal de Cron es el /etc/contrab que tiene un aspecto similar a esto:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * run-parts /etc/cron.hourly
02 4 * * * run-parts /etc/cron.daily
22 4 * * 0 run-parts /etc/cron.weekly
42 4 1 * * run-parts /etc/cron.monthly

En la primera sección del archivo nos encontramos con parámetros que definen el entorno de ejecución de las tareas:

  • SHELL: Indica bajo que shell queremos que se ejecuten las tareas programadas.
  • PATH: Indica la ruta bajo la que queremos que se ejecuten las tareas programadas.
  • MAILTO: Indica la dirección a la que se retransmitirá cualquier salida que se produzca durante la ejecución de las tareas programadas. Si esta variables esta vacía no se enviara ningún mensaje
  • HOME: Indica la ruta bajo la que queremos que se ejecuten las tareas programadas.

Cada línea del archivo crontab tiene un formato fijo:

minuto   hora   dia   mes   dia_de_la_semana   comando

  • Minuto: Acepta valores del 0 al 59.
  • Hora: Acepta valores del 0 al 23.
  • Dia: Acepta valores del 1 al 31.
  • Mes: Acepta valores del 1 al 12 y la versión corta de los meses en ingles (Jan, Feb, etc..).
  • Dia_de_la_semana: Acepta valores del 0 al 7 y la versión corta de los días en ingles (Sun, Mon, etc..).
  • Comando: El comando a ejecutar siendo valida también la ejecución de scripts.

Para cada apartado descrito anteriormente podemos utilizar también:

  • El carácter (*) para representar todos los valores validos para ese parámetro.
  • El carácter () para representar un rango de valores. Ej: 1-3 representa 1,2,3.
  • El carácter (,) para separar valores dentro de una lista. Ej: 1,2,6,8.
  • El carácter (/) para especificar valores de salto. Ej: * / 2 en el campo mes representaría que la tarea se realizará cada dos meses.
  • El carácter (#) al principio de una línea denota que esa línea es un comentario..

En la segunda parte del fichero podréis observar la utilización del comando run-parts que llaman para ejecutarse a los comandos definidos en los ficheros cron.hourly, cron.daily, cron.weekly, cron.monthly. Como habréis imaginado en estos sripts se almacenan llamadas a tareas cada hora, cada día, cada semana y cada mes. Aquí solo podremos almacenar scripts. Si alguna de las tareas se tiene que realizar fuera de estos ciclos de ejecución se almacenara en el directorio /etc/cron.d/ con el formato que hemos explicado para el archivo crontab.
Cualquier usuario puede programarse sus propias tareas si tiene los permisos necesarios para realizarlas. Para ello simplemente se ejecuta el comando crontab –e y se edita el fichero con los parámetros que he ido explicando en este post. El archivo generado por el usuario se almacenara en /var/spool/cron/nombre_usuario.
El demonio de cron revisa cada /etc/crontab, /etc/cron.d/ y /var/spool/cron/ para comprobar si se ha realizado cualquier modificación para cargarla en memoria. Debido a esto no será necesario que reiniciemos el servicio si modificamos cualquier cosa.
Algunos ejemplos serian:
Ejemplo 1:

0       22       *       *       *       /usr/bin/who

En este ejemplo definimos que todos los días a las 22:00 se revise quien esta conectado al servidor. En el caso de haber alguna conexión la salida del comando se mandara vía email a la cuenta que hayamos configurado en el parámetro MAILTO.
Ejemplo 2:

0       8       *       *       Fri       echo Toca revisar el servidor

En este ejemplo configuramos un aviso todos los viernes a las 8:00 que nos llegara vía mail para que revisemos el servidor.
Ejemplo 3:

0       */2       1,15,30      *       *       netstat

En este ejemplo definimos que nos envíe un email cada dos horas en punto, con las conexiones abiertas, los días 1, 15 y 30 de cada mes.