Qué es crontab y cómo programar tareas
Autor: Redacción Domeny.ForSale Publicado
En breve: Crontab es una tabla que contiene la programación de los comandos que el servicio cron ejecuta automáticamente, sobre todo en sistemas Linux y Unix. El nombre también designa el comando que permite gestionar esa tabla. Con crontab puedes, por ejemplo, hacer una copia de seguridad diaria o ejecutar un script cada pocos minutos sin iniciar sesión manualmente en el servidor.
¿Qué diferencia hay entre cron y crontab?
Cron es un servicio que funciona en segundo plano, consulta la programación y ejecuta los comandos guardados a las horas indicadas. Crontab contiene la configuración de esa programación. No basta con añadir una entrada: el servicio cron debe estar instalado y en ejecución, y el ordenador o servidor debe estar encendido a la hora programada.
Los usuarios pueden tener sus propias tablas crontab. Cada tarea se ejecuta con los permisos del propietario de su tabla, por lo que una entrada añadida por un usuario normal no obtiene automáticamente permisos de administrador. Esto importa tanto para la seguridad como para el acceso a los archivos.
Cron resulta útil para tareas técnicas periódicas: generar informes, sincronizar datos o eliminar archivos temporales. Sin embargo, no reacciona por sí solo a eventos como la recepción de un pedido: ejecuta los comandos según los horarios indicados en la configuración.
¿Cómo se interpreta una entrada de crontab?
En el crontab de un usuario, cada entrada contiene cinco campos de tiempo seguidos del comando:
minuto hora dia_del_mes mes dia_de_la_semana comando
Los campos se separan mediante espacios o tabulaciones. La tabla muestra su significado básico:
| Campo | Rango habitual | Significado del asterisco * |
|---|---|---|
| Minuto | 0–59 | Cada minuto |
| Hora | 0–23 | Cada hora |
| Día del mes | 1–31 | Cada día del mes |
| Mes | 1–12 | Cada mes |
| Día de la semana | 0–7; normalmente, 0 y 7 corresponden al domingo | Cada día de la semana |
Ejemplo de entrada:
30 2 * * * /home/ana/bin/backup.sh
Esta entrada ejecuta el script backup.sh todos los días a las 02:30. La hora se interpreta según la zona horaria que utiliza cron, normalmente la configurada en el servidor, no en el ordenador de quien edita la programación.
Para especificar los horarios también se pueden utilizar comas, rangos e incrementos:
0 8 * * 1-5— a las 08:00 de lunes a viernes.0 9,17 * * *— todos los días a las 09:00 y a las 17:00.*/15 * * * *— en los minutos 0, 15, 30 y 45 de cada hora.
Un incremento no es un intervalo contado desde que termina la tarea. La expresión */15 hace que el comando se ejecute según el reloj, aunque la ejecución anterior aún no haya terminado. Por su parte, */7 en el campo de minutos no produce intervalos uniformes de siete minutos durante todo el día: después del minuto 56, la siguiente ejecución corresponde al minuto 0 de la hora siguiente.
Hay una particularidad importante en los campos del día del mes y del día de la semana. En las implementaciones habituales, si ambos tienen valores restringidos, basta con que se cumpla una de las dos condiciones. Por tanto, la entrada 0 9 1 * 1 indica las 09:00 del primer día del mes o de los lunes, no únicamente de los lunes que coincidan con el primer día del mes. Consulta los detalles de la sintaxis en la documentación de tu implementación, normalmente mediante man 5 crontab.
¿Cómo se añade y se comprueba una tarea?
Lo más seguro es empezar con una prueba inocua que escriba la fecha en un archivo. Así puedes comprobar la programación independientemente del funcionamiento del script que realmente quieres ejecutar.
- Abre la tabla del usuario actual con el comando
crontab -e. - Añade la entrada siguiente, adaptando las rutas a tu sistema.
- Guarda el archivo y cierra el editor.
- Al cabo de uno o dos minutos, comprueba el archivo de salida.
* * * * * /usr/bin/date >> /home/ana/cron-test.log 2>&1
El operador >> añade la salida al final del archivo en lugar de sobrescribirlo. La expresión 2>&1 dirige los mensajes de error al mismo destino. El directorio de destino debe existir y el usuario debe tener permiso de escritura.
El comando crontab -l muestra las tareas guardadas. Si la prueba funciona, elimina la línea de prueba mediante crontab -e y añade la programación definitiva. Ten cuidado con crontab -r: elimina toda la tabla del usuario, no una sola entrada.
No confundas la tabla del usuario con el archivo del sistema /etc/crontab. En ese archivo y en los archivos habituales de /etc/cron.d/ hay un campo adicional entre los campos de tiempo y el comando, con el nombre del usuario que ejecutará la tarea.
¿Por qué el script funciona manualmente, pero no con cron?
Cron ejecuta los comandos en un entorno distinto, normalmente más limitado que el de la terminal del usuario. No debes dar por hecho que cargará la configuración del intérprete de comandos, tendrá las mismas variables o empezará a trabajar en el directorio del script.
Para diagnosticar el problema, comprueba sobre todo lo siguiente:
- Rutas: utiliza rutas completas a los programas y archivos; si el script necesita un directorio concreto, establécelo explícitamente.
- Permisos: el usuario que ejecuta la tarea debe poder leer los datos y escribir el resultado; un script ejecutado directamente necesita permiso de ejecución y una línea correcta que indique el intérprete.
- Entorno: define las variables necesarias y el intérprete adecuado en lugar de depender de la configuración de la terminal.
- Registros: guarda la salida y los errores de la tarea; comprueba también el estado del servicio y los registros de cron correspondientes a tu sistema.
Si la tarea puede durar más que el intervalo entre ejecuciones, utiliza un bloqueo que impida ejecutarla varias veces en paralelo, por ejemplo con la herramienta flock, si está disponible. Cron por sí solo no ofrece esa protección.
¿Cuándo necesitas algo más que crontab?
El cron clásico normalmente no recupera las tareas omitidas mientras el ordenador estaba apagado. El cambio de hora también puede afectar a las ejecuciones durante las horas de transición; el comportamiento exacto depende de la implementación. Para un portátil o para tareas que deban recuperar las ejecuciones pendientes, considera anacron o un temporizador de systemd configurado adecuadamente.
Antes de añadir una tarea importante, ejecuta su comando manualmente con el usuario que vaya a realizarla y después comprueba su ejecución mediante cron, guardando los errores. En el caso de las copias de seguridad, comprueba también que puedes restaurar los datos: que el script se ejecute correctamente no demuestra por sí solo que la copia sea útil.
Consulta también: ¿Qué es 2FA?
