Cron

De La Wiki de KiVi
Cron
Programar tareas con cron
TítuloPrograma tareas por usuario o sistema
Enlaces
Enlace del manual de redhathttps://www.redhat.com/sysadmin/linux-cron-command

Introducción

Cron es una herramienta de administración de tiempo en sistemas operativos Unix y Unix-like, que permite a los usuarios programar tareas para que se ejecuten automáticamente en momentos específicos, ya sea una vez, de forma recurrente o en momentos predefinidos. Crontab, por otro lado, es el archivo utilizado por el sistema para almacenar y administrar las listas de tareas programadas por los usuarios.

Funcionamiento de Cron

Cron se ejecuta en segundo plano y verifica periódicamente el archivo crontab para encontrar tareas programadas. Cuando encuentra una tarea que debe ejecutarse, la inicia automáticamente. Esto permite a los usuarios automatizar tareas repetitivas, como copias de seguridad, procesamiento de archivos, envío de informes, entre otras.

Cada línea de un archivo crontab representa un trabajo y es compuesto por una expresión CRON, seguida por un comando shell para ejecutarse.

Formato del fichero de crontab

De entre muchos ficheros, quiero comenzar con el fichero genérico de crontab, ubicado en /etc/crontab, en el que podemos añadir las tareas programadas por el sistema especificando el usuario que las ejecuta, este fichero no está disponible por defecto en las estaciones de trabajo.


El fichero de crontab tiene el siguiente formato:

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

#For details see man 4 crontabs
#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

En el que la línea más importante es la última que indica el tiempo de ejecución, el usuario que lo ejecuta y el comando.

Cadenas de texto

Hay que decir que en Linux existen algunas cadenas de texto reservadas para ejecutar procesos durante determinados periodos en el propio Crontab, esto nos será de mucha ayuda:

  • @reboot: Ejecuta una vez y nada más iniciarse el equipo.
  • @yearly: ejecuta sólo una vez al año: 0 0 1 1 *
  • @monthly: ejecuta una vez al mes y el primer día: 0 0 1 * *
  • @weekly: todas las semanas, el primer minuto de la primera hora de la semana: 0 0 * * 0.
  • @daily: todos los días a las 12 de la noche: 0 0 * * *
  • @midnight: Tiene el mismo efecto que el anterior.
  • @hourly: todas las horas durante su primer minuto: 0 * * * *

crontab como gestor de tareas por usuario

Las distribuciones actuales permiten que todos los usuarios puedan gestionar sus propias tareas, obviamente, según el usuario tendrán acceso y preferencias, por ejemplo, una tarea programada por "root" tiene prioridad sobre el resto.

Las tareas se gestionan con el comando:

crontab 

Para poder editar se utiliza la opción:

crontab -e

Para poder listar las tareas del usuario sin editar podemos poner:

crontab -l

Y para ver las tareas de otro usuario, por ejemplo que "root" vea las tareas del usuario "suport"

sudo -u suport crontab -l

Para borrar las tareas tenemos la opción de editarlas como antes he mostrado o ejecutar:

crontab -r

Que borra todas las tareas.

Una vez están editadas las tareas no hace falta reiniciar el servicio, ya que se aplican al momento.

IMPORTANTE - es necesario recordar que NO es lo mismo ejecutar el comando "crontab -e" que "sudo crontab -e", el primer comando lo ejecuta el usuario actual mientras que el segundo lo ejecuta root.

Tareas del sistema cron

Cron tiene ficheros en el que se pueden organizar las tareas según su periodicidad, de hecho, así es como se han diseñado los servicios desde que existe el sistema. Estos se encuentran en el directorio de configuración "/etc", por ejemplo en un servidor actualizado encontramos:

ls -l /etc/cron*                                                                                                                                                                                  

-rw-r--r--. 1 root root   0 jul 19  2023 /etc/cron.deny

-rw-r--r--. 1 root root 451 jul 19  2023 /etc/crontab

/etc/cron.d:

total 8

-rw-r--r--. 1 root root 128 jul 19  2023 0hourly

-rw-r--r--. 1 root root 775 feb  9  2023 certbot

/etc/cron.daily:

total 4

-rwxr-xr-x. 1 root root 215 jul 22  2023 00webalizer

/etc/cron.hourly:

total 4

-rwxr-xr-x. 1 root root 610 jul 19  2023 0anacron

/etc/cron.monthly:

total 0

/etc/cron.weekly:

total 0

En el que vemos los directorios cron.d, cron.daily, cron.hourly, cron.monthly cron.weekly. Esto viene a referirse a las tareas de sistema sin definir y que podemos configurar, según necesidad, las tareas diarias, horarias, mensuales y semanales respectivamente.

Solo por poner una tarea dentro del directorio cron.daily haría que la tarea fuera diaria y se ejecutaría a las 0:00 de cada día.

Ejemplos comunes

A continuación pongo unos ejemplos de tareas programadas:

Tarea diaria:

@daily git -C ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k pull 

Tres tareas programadas por root:

0 0 24 10 * certbot-3 renew --dry-run --quiet 2>&1 | grep -q "No renewals were attempted" || (certbot-3 renew --quiet && echo "Certificado renovado el $(date)" >> /srv/data/logCertbot.log) &

  1. repara el Nextcloud recusivamente

@hourly nice -n 19 /opt/servidor/reparaNextcloud.sh &

  1. Antivirus

0 23 * * * nice -n 19 /opt/servidor/antivirus.sh > /mnt/seg/infected/informeClamAV.log &

En estos tres ejemplos tengo que:

  • a las 0:00 del día 24 de octubre se actualizará el certificado y generará un fichero de log.
  • Cada hora ejecutará con prioridad baja el script reparaNextcloud.sh y lo generará en segundo plano.
  • Todos los dias a las 23:00 se ejecutará un script llamado antivirus.sh y generará un fichero de log en segundo plano.


Referencias

Podemos leer más sobre cron en: