Antes de iniciar con las sintaxis y comandos cron de Unix, es necesario hacer una rápida revisión al sistema de restricciones para los usuarios. Para que un usuario pueda ejecutar la instrucción crontab, lo primero que se tiene que hacer es revisar y en su caso otorgar permisos de modificar su archivo crontab.
La configuración de los permisos a los usuarios se realiza con dos archivos cron.allow y cron.deny y con base en ellos podemos tener diferentes configuraciones.
Para que un usuario pueda utilizar el comando crontab debe aparecer su nombre en el archivo cron.allow. Si el archivo cron.allow no existiera el usuario podrá acceder si su nombre NO existe en el archivo cron.deny.
Si sólo existe el archivo cron.deny pero está en blanco, todos los usuarios podrán hacer uso del crontab.
Si no existiese ninguno de los dos archivos, solo el usuario root podrá hacer uso de los comandos para programar el cron.
Para la sintaxis de los archivos cron.allow y cron.deny es únicamente necesario escribir un nombre de usuario por línea.
Sintaxis crontab
La sintaxis crontab es la siguiente:
$ crontab [-e | -l | -r ] [usuario]
Le parámetro -e indica la edición del cron, -l ver las tareas programadas en el archivo cron y -r remover (borrar) un archivo cron. Si no se especifica el usuario, el comando se ejecutará para el usuario en sesión
Editar los crontabs
Una vez que ya tienes permisos de usuario para ejecutar crontab vamos a comenzar a editar el archivo crontab con la instrucción:
$ crontab -e
0
Con este comando se abrirá el editor de texto predeterminado, si prefieres utilizar vi como editor de texto predeterminado basta con definir la variable de ambiente EDITOR=vi. Para salir del modo edición basta con escribir q[Enter].
En la configuración del crontab le definiremos la frecuencia con que queremos que se ejecute un proceso y la ubicación del shell que vamos a programar con la siguiente sintaxis que especifica el intervalo de repetición de la tarea:
* * * * * Comando o programa a ejecutar
| | | | |
| | | | |—– día de la semana (0 – 6) (0-> Domingo)
| | | |——- Mes (1 – 12)
| | |——— Día del mes (1 – 31)
| |———– Hora (0 – 23)
|————- Minuto (0 – 59)
La tarea se ejecutará de acuerdo a estos parámetros, por ejemplo si quisieras ejecutar el programa /export/home/respaldo.sh todos los días viernes a las 3 de la mañana la sintaxis sería la siguiente:
0 3 * * 4 /export/home/respaldo
Para especificar más de un valor en un registro se puede utilizar la coma (,) para separar los valores; en el ejemplo anterior puedes definir que la tarea se repita los lunes y los viernes a las 3 de la mañana de la siguiente manera:
0 3 * * 1,4 /export/home/respaldo
Ejemplos de repetición
30 10 * * * Todos los días a las 10:30 hrs.
0 0 1,10,20 * * Los días 1, 10 y 20 de cada mes a la media noche.
0,30 * * * 1 Cada 30 minutos los días lunes, (00:00hrs., 00:30hrs., 01:00hrs. …).
0 22 * 1,2,3,4,5,6,7 * 5 El primer viernes de cada mes a las 10 de la noche.
También puedes programar una tarea para ejecute todos los archivos de una carpeta, por ejemplo:
0 3 * * 1,4 /export/home/actualizareportes/*
Ambiente del cron
Cuando se invoca una tarea programada con el cron se ejecuta con las siguientes variables de ambiente:
HOME=(directorio home del usuario)
LOGNAME=(nombre de usuario)
PATH=/usr/bin:.
SHELL=/usr/bin/sh
Si requieres ejecutar una tarea programada con variables de ambiente diferentes o agregar algunas otras variables de ambiente a la ejecución, es recomendable programar un script o programa shell que defina las variables de ambiente y luego ejecute la tarea.
Log o bitácora de errores
Para configurar que la ejecución de una tarea genere un archivo con la información de la ejecución del cron puedes dirigir mediante la salida estándar hacía el archivo que lo requieras, por ejemplo:
0 3 * * 1,4 /export/home/respaldo > /export/home/respaldo.log
Así se generará o sobrescribirá el archivo /export/home/respaldo.log cada vez que se ejecute la tarea programada.
Archivos cron
Los archivos que determinan el funcionamiento de los trabajos programados con cron en Unix son los siguientes:
/etc/cron.d/cron.allow
/etc/cron.d/cron.deny
/etc/cron.d/FIFO
/var/spool/cron/crontabs/*
Si por alguna razón se cerró el proceso cron y lo quieres reiniciar pero te marca el siguiente error:
! cannot start cron; FIFO exists
! ******* CRON ABORTED ********
Tendrías que borrar el archivo /etc/cron.d/FIFO y ejecutar nuevamente:
$ /usr/sbin/cron
* * * * * /sbin/ping -c 1 192.168.0.1 >> /dev/null
Este crontab ejecuta el comando ping al equipo 192.168.0.1 cada minuto, de cada hora, de cada día, de cada mes, es decir, hace un ping cada minuto.
0 20 * 10 1-5 /sbin/ping -c 1 192.168.0.1 >> /dev/null
El mismo comando, pero sólo se ejecuta los días laborables de la semana (Lun-Vie) a las 8:00 PM en punto y sólo el mes de octubre.
0 0 1,15,28 * * /home/mmonrdz/scripts/respaldar.py
Este crontab ejecuta un script de respaldo en python de lunes a domingo a la medianoche (0:00 AM) los días 1, 15 y 28 de cada mes. ¿Porqué 28 y no 30?, Por febrero 😉
0,50 7,8 * * 1 /home/mmonrdz/scripts/dbcotiza.pl >/dev/null 2>&1
Ejecuta un script que actualiza la base de datos de cotizaciones todos los lunes a las 7:00 AM, 7:50 AM, 8:00 AM y 8:50 AM sin enviar el email de notificación.
45 19 * * * rm /home/newbie/tmp/*
esta línea indica que el contenido del directorio /home/newbie/tmp/ será borrado todos los días a las 7:45 PM.
Ejecutar todos los días un script de copia de seguridad a las 7:00 de la mañana :
0 7 * * * /home/usuario/copiadeseguridad.sh
Ejecutar todos los primeros de mes un script de copia de seguridad a las 7:00 de la mañana :
0 7 1 * * /home/usuario/copiadeseguridad.sh
Ejecutar todos los viernes a las 21:30 un script de copia de seguridad :
30 21 * * 5 /home/usuario/copiadeseguridad.sh
Llamar al comando fetchmail cada 15 minutos :
0,15,30,45 * * * * fetchmail
*/15 * * * * fetchmail