Cómo se calcula
Una línea de crontab empieza con cinco campos separados por espacios, seguidos del comando que se ejecuta. Cron los revisa cada minuto y ejecuta el comando cuando coinciden el minuto, la hora, el día del mes, el mes y el día de la semana.
┌─ Minuto │ ┌─ Hora │ │ ┌─ Día del mes │ │ │ ┌─ Mes │ │ │ │ ┌─ Día de la semana * * * * * /path/to/command
Los dos campos de día se combinan de una forma que sorprende a mucha gente: cuando ambos están restringidos, la tarea se ejecuta cuando coincide cualquiera de los dos. 0 0 13 * 5 se ejecuta todos los días 13 y todos los viernes, no solo el viernes 13. Cuando uno de los dos empieza por *, tienen que coincidir ambos.
Los cinco campos
| Campo | Valores permitidos |
|---|---|
| Minuto | 0–59 |
| Hora | 0–23 |
| Día del mes | 1–31 |
| Mes | 1–12 o JAN–DEC |
| Día de la semana | 0–7 o SUN–SAT (0 y 7 son domingo) |
Caracteres especiales
- * coincide con todos los valores del campo.
- , enumera valores: 1,15 es el 1 y el 15.
- - es un rango: 1-5 es de lunes a viernes en el campo del día de la semana.
- / es un paso: */10 es cada décimo valor, 5/10 es cada décimo desde el 5, 9-17/2 cada dos horas de 9 a 17.
- @hourly, @daily, @weekly, @monthly y @yearly sustituyen los cinco campos; @reboot se ejecuta una vez cuando arranca el servidor.
Ejemplo
30 2 * * 1-5 se ejecuta a las 02:30 de lunes a viernes: minuto 30, hora 2, cualquier día del mes, cualquier mes y días de la semana del 1 al 5. Escrita como 30 2 * * 1-5 /usr/local/bin/backup.sh en el crontab, inicia una copia de seguridad cada noche laborable.
Preguntas
¿Qué significa */5 en cron?
Cada quinto valor del campo. En el campo de minutos, */5 ejecuta la tarea en los minutos 0, 5, 10 y así hasta el 55: cada cinco minutos. */15 es cada cuarto de hora, y */2 en el campo de horas es cada dos horas desde medianoche.
¿Cómo añado una tarea cron en un servidor Linux?
Ejecuta crontab -e con el usuario con el que debe ejecutarse la tarea, añade una línea con los cinco campos y el comando, guarda y cierra el editor. crontab -l muestra las tareas, y las tareas de todo el sistema van en un archivo de /etc/cron.d con el nombre de usuario después de los cinco campos.
¿Qué zona horaria usa cron?
La del propio servidor, normalmente UTC en un VPS. 0 3 * * * en un servidor UTC se ejecuta a las 04:00 en Madrid en invierno y a las 05:00 en verano. Algunos cron, como cronie, aceptan una línea CRON_TZ= encima de las tareas; si no, convierte la hora tú mismo.
¿Debo usar cron o un temporizador de systemd?
Cron es más sencillo y funciona en todas partes. Un temporizador de systemd necesita dos archivos pequeños, pero registra cada ejecución en el journal, puede recuperar ejecuciones perdidas mientras el servidor estaba apagado (Persistent=true) y evita que dos copias de la misma tarea se ejecuten a la vez.