Cómo añadir tareas al Cron de Linux

Balu1 Febrero 2011 - 12:21pm 3 comentarios
Enviar por Email Imprimir

Cómo añadir tareas al Cron de LinuxMuchas 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 daemons colocan 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

Imagen de ADN

Estoy tratando de instalar un autorespondedor con el cual voy a enviar correos electronicos a mis suscriptores.
Tengo ya instalado el programa, pero a la hora de configurar el comando del cron no se ejecuta
Estoy trabajando con Parallels y no se que poner ni como ponerlo, por ejemplo, para entrar al administrador de correos es ar.cgi, debo de an otar la direccion para entrar? o que debo haceer

Gracias
Abraham

Imagen de Anonymous
Anonymous

Muy bueno, muy bien explicado, muchas gracias.

Imagen de R00tedLine

Muy bien redactado, siempre hay alguna cosilla que se nos pasa y no esta de más tener post como este que te lo recuerdan muy muy bien donde y que tocar.

Espero que el autor siga haciendo estas cosas tan chulas.

Un Saludo
R00teDLine

Dejar comentario

Tutoriales

Cómo descargar Paper de Facebook aún fuera de EE.UU.
La semana pasada, la famosa red social anunció "Paper", una...
Cómo transferir archivos grandes de PC a PC
Pasar datos de una computadora a otra puede ser bastante sencillo...
Qué hacer antes de descargar iOS 7
A sólo una horas de la llegada del iOS 7, recuerden que antes de...

Artículo Recomendado

Google agota un modelo Google Glass en su único día de ventas abiertas
Google Glass hizo del martes su día. Por primera vez, desde su lanzamiento, cualquiera en EE.UU. pudo adquirir sus gafas inteligentes y la respuesta del público no pudo ser mejor. Así es, en el que podría ser su... más