Cron en Linux: tareas, registros y bloqueo de ejecuciones
Cron permite iniciar comandos siguiendo un calendario. Para utilizarlo bien necesitas entender tanto la expresión horaria como el usuario y entorno desde el que se ejecutará el trabajo.
Esta guía utiliza cron de Ubuntu o Debian y una prueba sin privilegios de administrador. Otras implementaciones pueden tener extensiones distintas. Comprueba el manual del sistema antes de trasladar una expresión entre máquinas.
Lee los cinco campos en orden
El crontab de un usuario utiliza minuto, hora, día del mes, mes y día de la semana, seguidos del comando:
# minuto hora día-mes mes día-semana comando
30 2 * * * /ruta/absoluta/tarea
0 9 * * 1 /ruta/absoluta/tarea
*/15 9-17 * * 1-5 /ruta/absoluta/tarea
La primera línea programa las 02:30 todos los días; la segunda, las 09:00 de los lunes; la tercera, los minutos 00, 15, 30 y 45 de cada hora entre 09 y 17, de lunes a viernes.
No confudas pasos dentro de un campo con un intervalo continuo. */35 en minutos selecciona 00 y 35 de cada hora; no mantiene una separación constante de 35 minutos durante todo el día.
En el cron tradicional descrito aquí, si restringes tanto el día del mes como el de la semana, basta que coincida cualquiera de los dos. Por eso 0 9 1-7 * 1 no significa únicamente el primer lunes.
Identifica la cuenta y conserva la programación
whoami
crontab -l
systemctl is-active cron
timedatectl
Si todavía no existe crontab, el listado puede informar de ello. Antes de editar uno existente, guarda una copia:
crontab -l > "$HOME/crontab-anterior.txt"
crontab -e
Revisa que la copia se haya generado correctamente. No utilices crontab -r para retirar una sola tarea: elimina toda la programación del usuario.
Prepara un trabajo verificable
En tu cuenta, crea un directorio:
mkdir -p "$HOME/tareas"
nano "$HOME/tareas/prueba-cron"
Guarda este script Bash:
#!/bin/bash
set -Eeuo pipefail
export PATH=/usr/bin:/bin
base="${HOME:?}/tareas"
exec 9>"$base/prueba.lock"
flock -n 9 || { echo "Se omitió una ejecución solapada" >&2; exit 1; }
printf '%s usuario=%s ejecución correcta\n' "$(date -Is)" "$(id -un)"
Hazlo ejecutable y comprueba la salida manual:
chmod 0700 "$HOME/tareas/prueba-cron"
"$HOME/tareas/prueba-cron"
El bloqueo evita dos instancias simultáneas de este script. No coordina automáticamente otros programas ni garantiza exclusión entre varios servidores.
Programa una prueba de un minuto
En crontab -e agrega lo siguiente después de sustituir USUARIO por tu nombre real y confirmar la ruta:
SHELL=/bin/sh
PATH=/usr/local/bin:/usr/bin:/bin
* * * * * /home/USUARIO/tareas/prueba-cron >> /home/USUARIO/tareas/prueba.log 2>&1
La carpeta y el archivo de script deben ser accesibles por esa cuenta. La redirección también necesita permisos de escritura. Espera un par de minutos y revisa:
tail -n 10 "$HOME/tareas/prueba.log"
crontab -l
Busca horas distintas y el usuario previsto. Después sustituye la frecuencia de prueba por la necesaria, por ejemplo 30 2 * * * para ejecución diaria a las 02:30.
Un log con fechas nuevas confirma que la prueba corrió. Para el trabajo real, registra además su resultado y verifica el producto esperado, como un archivo válido o una respuesta del sistema destino.
Entorno, zona horaria y archivos del sistema
Cron no carga necesariamente tu sesión interactiva, alias, entorno virtual ni agente SSH. Utiliza rutas explícitas y prepara credenciales con permisos limitados. Los signos % en el comando tienen significado especial en esta implementación; para expresiones complejas, utiliza un script.
Comprueba la zona horaria que usa el daemon. Definir TZ dentro del comando puede cambiar la hora que imprime un programa sin cambiar cuándo lo lanza cron. No asumas soporte de CRON_TZ en todas las distribuciones.
Los cambios de hora y las tareas perdidas durante un apagado dependen de la implementación y configuración. Si necesitas recuperación de ejecuciones o calendarios más expresivos, evalúa un timer de systemd y sus opciones.
En /etc/cron.d y /etc/crontab existe un campo adicional para el usuario:
30 2 * * * root /usr/local/sbin/backup-sitio
No copies ese campo root al crontab personal. Tampoco programes la misma tarea allí y en /etc/cron.daily salvo que busques dos ejecuciones.
Preguntas frecuentes
¿Cron envía siempre los errores por correo?
No. Necesita un transporte de correo operativo y una configuración que permita entregarlo. Registra la salida y prueba cualquier canal de aviso que elijas.
¿Qué ocurre si la tarea dura más que su intervalo?
Cron puede iniciar otra instancia. Utiliza un bloqueo cuando el solapamiento sea perjudicial y registra las ejecuciones omitidas.
¿Por qué funciona al ejecutarla a mano y falla en cron?
Suelen diferir usuario, directorio, PATH, variables y permisos. Reproduce el entorno, registra el error y comprueba cada dependencia sin asumir que se carga tu sesión.
En pocas palabras
Una tarea programada necesita horario, identidad, entorno y evidencia de ejecución. Cron inicia procesos cuando corresponde; tu script debe controlar errores y evitar solapamientos cuando puedan causar problemas.
Conclusión
Prueba primero una tarea pequeña y visible bajo la cuenta definitiva. Después añade el trabajo real, revisa su salida y documenta qué hacer si falla o no llega a ejecutarse.
Para continuar, revisa Cómo instalar Ubuntu desde una USB: paso a paso y Cómo instalar Docker en Ubuntu 24.04: guía práctica paso a paso.
Fuentes y documentación
Documentación de manpages.debian.org.
