Uso básico de cron y crontab

LINUX

¿Qué es cron?

En los sistemas operativos Unix y Linux, cron es un administrador de procesos que se encuentra en segundo plano en forma de demonio o «daemon» y que ejecuta procesos o scripts según se programe a intervalos regulares (puede ser cada minuto, un día concreto, semana, mes etc…). Se usa principalmente para tareas administrativas y para el usuario root se encuentra en /etc/crontrab, aunque también podemos usar el comando crontab como si de un usuario normal se tratase.

Cada usuario puede tener también su propio cron mediante la instrucción «crontab». Si queremos listar el contenido del cron del usuario con el que estamos logados:

$ crontab -l: listado del crontab

$ crontab -e: edición del crontab

En el caso de no tener ningún cron nos aparecerá: no crontab for root – using an empty one

Select an editor. To change later, run 'select-editor'.
/bin/nano <---- easiest
/usr/bin/vim.tiny
/bin/ed

Choose 1-3 [1]

Estado/Reiniciar cron

Cron es un «daemon» que se inicia al arrancar el equipo, por lo que no es necesario iniciarlo, pero sí que podemos ver su estado, y reiniciarlo en el caso de que hagamos cambios, para no tener que reiniciar la máquina.

Ver el estado:
$ /etc/init.d/cron status
$ service cron status

● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-04-06 08:44:56 CEST; 4h 57min ago
Docs: man:cron(8)
Main PID: 776 (cron)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/cron.service
└─776 /usr/sbin/cron -f
Reiniciar el servicio cron
$ /etc/rc.d/init.d/cron restart
$ service cron restart

[ ok ] Restarting cron (via systemctl): cron.service.

Usar cron

Tenemos dos formas de usar «cron». Una de ellas se encuentra en el directorio /etc/ donde tenemos los directorios por hora, día, semana o mes respectivamente. Colocando el script en alguno de estos directorios se ejecutará según se especifica.

cron.hourly
cron.daily
cron.weekly
cron.monthly

(No olvidemos darle permisos de ejecución a nuestro script: chmod +x file.sh)

La otra forma de ejecutar cron es modificando el fichero /etc/crontab que tiene este aspecto:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

SHELL: es el «shell» bajo el que se ejecuta el cron.

PATH: indica la ruta de directorios donde el cron buscará el comando a ejecutar.

MAIL TO: correo a quién se enviará la salida.

HOME: el directorio raíz del cron que se indica en el usuario /etc/passwd

- minute: controla el minuto de la hora en que el comando será ejecutado, este valor debe de estar entre 0 y 59.
- hour: controla la hora en que el comando será ejecutado, se especifica en un formato de 24 horas, los valores deben estar entre 0 y 23, 0 es 00:00 am.
- day of month: día del mes en que se quiere ejecutar el comando. Por ejemplo se indicaría 5, para ejecutar el comando el día 5 del mes.
- month: mes en que el comando se ejecutará, puede ser indicado numéricamente del 1 al 12, o con el nombre del mes en inglés, sólo las tres primeras letras.
- day of week: día en la semana en que se ejecutará el comando, puede ser numérico (0-7) o con el nombre del día en inglés, sólo las tres primeras letras. (0 y 7 = domingo)
- user-name: usuario que ejecuta el comando.
- command to be executed: comando o script a ejecutar. Este campo puede contener varios comandos deparados por punto y coma.

Ejemplos básicos

EjemploDescripción
01 * * * *Se ejecuta al minuto 1 de cada hora de todos los días
15 8 * * *A las 8:15 a.m. de cada día
15 20 * * *A las 8:15 p.m. de cada día
00 5 * * 0A las 5 a.m. todos los domingos
* 5 * * SunCada minuto de 5:00a.m. a 5:59a.m. todos los domingos
45 19 1 * *A las 7:45 p.m. del primero de cada mes
01 * 20 7 *Al minuto 1 de cada hora del 20 de julio
10 1 * 12 1A la 1:10 a.m. todos los lunes de diciembre
00 12 16 * WenAl mediodía de los días 16 de cada mes y que sea Miércoles
30 9 20 7 4A las 9:30 a.m. del dia 20 de julio y que sea jueves
30 9 20 7 *A las 9:30 a.m. del dia 20 de julio sin importar el día de la semana
20 * * * 6Al minuto 20 de cada hora de los sábados
20 * * 1 6Al minuto 20 de cada hora de los sábados de enero

Ejemplos con listas o incrementos

EjemploDescripción
59 11 * 1-3 1,2,3,4,5A las 11:59 a.m. de lunes a viernes, de enero a marzo
45 * 10-25 * 6-7Al minuto 45 de todas las horas de los días 10 al 25 de todos los meses y que el día sea sábado o domingo
10,30,50 * * * 1,3,5En el minuto 10, 30 y 50 de todas las horas de los días lunes, miércoles y viernes
*/15 10-14 * * *Cada quince minutos de las 10:00a.m. a las 2:00p.m.
* 12 1-10/2 2,8 *Todos los minutos de las 12 del día, en los días 1,3,5,7 y 9 de febrero y agosto. (El incremento en el tercer campo es de 2 y comienza a partir del 1)
0 */5 1-10,15,20-23 * 3Cada 5 horas de los días 1 al 10, el día 15 y del día 20 al 23 de cada mes y que el día sea miércoles
3/3 2/4 2 2 2Cada 3 minutos empezando por el minuto 3 (3,6,9, etc.) de las horas 2,6,10, etc (cada 4 horas empezando en la hora 2) del día 2 de febrero y que sea martes
/1 * * * *Cada minuto utilizando. La barra «/» significa crear una lista de todos los minutos y ejecutar el trabajo cada minuto
0,5,10,15,20,25,30,35,40,45,50,55 * * * *Cada 5 minutos separando con «,» para crear una lista de minutos