CronDrive
Guías

Por qué tu cron job no se ejecuta

Actualizada el 16 de octubre de 2026

Cuando un cron job no se ejecuta, no siempre es evidente dónde buscar el error. Revisa estos puntos en orden: primero si cron intentó ejecutar el job, después por qué falló el comando.

1. ¿Está activo el servicio cron?

systemctl status cron     # Debian, Ubuntu
systemctl status crond    # RHEL, Fedora, Rocky, AlmaLinux

Si está detenido, inícialo y actívalo al arrancar:

sudo systemctl enable --now cron

Un contenedor de Docker normalmente no tiene cron activo, salvo que su imagen lo inicie. Revisa que el proceso esté con ps aux | grep cron.

2. ¿Cron inició el job?

Cron registra cada comando que inicia. Busca tu job cerca de la hora en que debía ejecutarse:

grep CRON /var/log/syslog                # Debian, Ubuntu
sudo journalctl -u cron --since today    # Debian, Ubuntu con systemd
sudo journalctl -u crond --since today   # RHEL, Fedora
sudo tail -n 50 /var/log/cron            # RHEL, CentOS
  • El comando está en el log: cron lo ejecutó, y el problema está en el comando. Pasa al punto 4.
  • No aparece: revisa el horario y el crontab, en el punto 3. Comprueba también que estés consultando el registro correcto, porque depende de la distribución.

3. ¿El horario es el que crees?

  • Prueba la expresión. Pégala en el probador de cron y revisa sus próximas ejecuciones. Una sorpresa común: cuando están puestos el día del mes y el día de la semana, cron ejecuta el job en cualquiera de los dos. 0 0 13 * 5 se ejecuta todos los días 13 y todos los viernes.

  • Revisa la zona horaria del servidor. Cron usa la zona horaria del servidor, que puede no ser la tuya: timedatectl | grep "Time zone". Algunas implementaciones, como cronie, aceptan además CRON_TZ= en el crontab. Después de cambiar la zona horaria del servidor, reinicia cron.

  • Revisa de quién es el crontab. crontab -l muestra el tuyo, y sudo crontab -l el de root. Las líneas de /etc/crontab y de /etc/cron.d/ tienen un campo más, con el usuario, antes del comando:

    0 3 * * * root /usr/local/bin/backup.sh
  • Nombra los archivos de /etc/cron.d/ sin puntos. En Debian y Ubuntu, cron ignora un archivo como backup.cron: llámalo backup.

  • Termina el crontab con un salto de línea. Cron puede ignorar una última línea que no lo tenga. crontab -e normalmente lo agrega, pero un archivo que copiaste puede no tenerlo.

4. ¿Funciona el comando en el entorno de cron?

Cron no lee el perfil de tu shell, así que el comando se ejecuta con un entorno más limitado que el de tu terminal. Estas son las diferencias más comunes:

  • El PATH es corto, muchas veces solo /usr/bin:/bin. Los comandos de /usr/local/bin, o instalados con nvm, rbenv o pyenv, no se encuentran. Usa rutas absolutas, como /usr/local/bin/node, o define el PATH al principio del crontab:

    PATH=/usr/local/bin:/usr/bin:/bin
  • El shell es /bin/sh, no bash, así que source, [[ ]] o los arreglos fallan. Ejecuta el script con bash (/bin/bash /ruta/al/job.sh) o define SHELL=/bin/bash en el crontab.

  • % significa salto de línea en una línea de crontab, así que date +%F rompe el comando. Escápalo: date +\%F.

  • El directorio de trabajo es el home, así que las rutas relativas pueden apuntar al directorio equivocado. Usa rutas absolutas, o cd /ruta/a/la/app && ....

  • No están las variables de .bashrc ni de .profile: claves de API, DATABASE_URL, JAVA_HOME. Defínelas en el crontab o cárgalas en el script.

Para probar el comando casi como lo ejecuta cron:

env -i HOME="$HOME" PATH=/usr/bin:/bin /bin/sh -c 'cd ~ && /ruta/al/job.sh'

5. ¿Puede cron ejecutar el script?

  • Tiene que ser ejecutable, con chmod +x /ruta/al/job.sh y una primera línea como #!/bin/bash.
  • El usuario del crontab necesita acceso a lo que usa el script: archivos, directorios, sockets.
  • Los saltos de línea de Windows (\r\n) lo hacen fallar con /bin/bash^M: bad interpreter. Corrígelos con sed -i 's/\r$//' /ruta/al/job.sh.

6. Lee el error

Cron manda por email la salida de cada comando al usuario del crontab, o a MAILTO. Si el servidor no tiene configurado el envío de correo, no recibirás esa salida. Guárdala en un archivo:

0 3 * * * /ruta/al/job.sh >> /var/log/job.log 2>&1

Espera la próxima ejecución, o cambia el horario para que se ejecute en un par de minutos, y busca en ese log el mensaje de error.

Entérate antes la próxima vez

Estas revisiones te ayudan a encontrar la causa cuando ya detectaste el problema. Para enterarte antes, configura alertas si el job no empieza, tarda demasiado o termina con un error.

CronDrive te avisa por email, o en Slack, cuando un job con este horario falla, o no se inicia o no termina a tiempo. Gratis hasta 15 jobs.

Lo que verías con este horario

Un ejemplo con las últimas ejecuciones de este horario y resultados inventados: una falló y otra no se ejecutó.

Horas en UTC.

Hora
jue 15 oct, 03:00 A tiempo Inició 03:00, terminó 03:13, duró 13 min.
mié 14 oct, 03:00 No se ejecutó Alertas enviadas a las 03:05 y 03:30.
mar 13 oct, 03:00 A tiempo Inició 03:00, terminó 03:14, duró 14 min.
lun 12 oct, 03:00 Falló con código 1 Alerta enviada a las 03:04. Inició 03:00, terminó 03:04, duró 4 min.
dom 11 oct, 03:00 A tiempo Inició 03:00, terminó 03:13, duró 13 min.
sáb 10 oct, 03:00 A tiempo Inició 03:00, terminó 03:14, duró 14 min.

La alerta de la ejecución que falló

Email de CronDrive, lun 12 oct, 03:04

Falló (código 1): "Tu job"

El job "Tu job" falló con el código de salida 1.

Si conectas Slack, el mismo mensaje llega a tu canal.

El cambio en tu crontab

0 3 * * * curl -fsS -m 10 https://job.crondrive.com/uG2Exw/start/$$; /path/to/job.sh; curl -fsS -m 10 https://job.crondrive.com/uG2Exw/end/$?/$$

Dos llamadas alrededor de tu comando, en la misma línea. La línea de tu job trae su propio token.

Monitorear este horario