Cómo Mostrar y Listar Cron Jobs Usando Crontab
El comando crontab es la interfaz principal para ver, editar y gestionar tareas programadas en el sistema cron de Unix. Para listar todos los trabajos cron del usuario actualmente conectado, ejecute crontab -l en cualquier terminal. Para trabajos de root o de todo el sistema, inspeccione /etc/crontab, /etc/cron.d/ y /var/spool/cron/crontabs/ directamente.
Cron es la columna vertebral de la automatización de tareas en Linux y sistemas similares a Unix. Ya sea que esté ejecutando volcados de bases de datos nocturnos en un entorno de VPS Hosting, rotando registros en un Servidor Dedicado, o renovando Certificados SSL automáticamente mediante Certbot, comprender cómo auditar y listar cada tarea programada en una máquina es una habilidad de administrador de sistemas innegociable. Esta guía cubre cada capa del stack de cron — crontabs de usuario, crontabs del sistema, directorios drop-in y el spool — junto con problemas del mundo real que afectan incluso a ingenieros experimentados.
Qué es Crontab y cómo funciona el sistema Cron
Crontab (abreviatura de "cron table") es un archivo de configuración por usuario que indica al daemon crond qué comandos ejecutar y cuándo. Cada cuenta de usuario en un sistema — incluido root — puede mantener un crontab independiente. El daemon lee estos archivos al inicio y después de cualquier edición, luego despacha los trabajos según sus especificaciones de tiempo.
El ecosistema cron en una distribución moderna de Linux consta de varias capas distintas:
- Crontabs de usuario — gestionados mediante
crontab -ey almacenados en/var/spool/cron/crontabs/(Debian/Ubuntu) o/var/spool/cron/(RHEL/CentOS) - Crontab del sistema — el archivo
/etc/crontab, que incluye un campo adicionaluserpor entrada - Directorio drop-in —
/etc/cron.d/, donde los paquetes instalan sus propias definiciones de trabajos - Directorios run-parts —
/etc/cron.hourly/,/etc/cron.daily/,/etc/cron.weekly/,/etc/cron.monthly/, que contienen scripts ejecutables en lugar de archivos con sintaxis crontab - Anacron — un complemento de cron que gestiona trabajos en máquinas que no están en funcionamiento las 24 horas del día, los 7 días de la semana, leyendo desde
/etc/anacrontab
Comprender en qué capa reside un trabajo es fundamental al auditar un servidor, porque crontab -l por sí solo omitirá la mayoría de las tareas programadas en un sistema de producción típico.
Sintaxis de campos de tiempo en Crontab
Cada entrada de crontab sigue una especificación de tiempo fija de cinco campos antes del comando:
* * * * * command_to_execute
| | | | |
| | | | +----- day of the week (0–7, Sunday = 0 or 7)
| | | +------- month (1–12)
| | +--------- day of the month (1–31)
| +----------- hour (0–23)
+------------- minute (0–59)Atajos de sintaxis especiales compatibles con la mayoría de las implementaciones de cron:
| Atajo | Equivalente | Significado |
|---|---|---|
@reboot | — | Ejecutar una vez al inicio del daemon |
@yearly | 0 0 1 1 * | Una vez al año |
@monthly | 0 0 1 * * | El primer día de cada mes |
@weekly | 0 0 * * 0 | Cada domingo a medianoche |
@daily | 0 0 * * * | Cada día a medianoche |
@hourly | 0 * * * * | Al inicio de cada hora |
Los archivos /etc/crontab y /etc/cron.d/ añaden un sexto campo — el nombre de usuario bajo el cual se ejecuta el comando — entre la especificación de tiempo y el comando en sí.
Cómo listar trabajos Cron: todos los métodos explicados
1. Ver sus propios trabajos Cron de usuario
crontab -lEsto imprime el crontab del usuario que ejecuta el comando. Si aún no existe ningún crontab, verá una salida en blanco o el mensaje no crontab for <username> — ambos son normales.
Ejemplo de salida:
# m h dom mon dow command
0 0 * * * /home/deploy/backup.sh
30 2 * * 7 /home/deploy/scripts/cleanup.sh
15 */4 * * * /usr/local/bin/health-check.sh >> /var/log/health.log 2>&1En este ejemplo:
backup.shse ejecuta cada día a medianochecleanup.shse ejecuta cada domingo a las 02:30health-check.shse ejecuta cada cuatro horas comenzando a las 00:15, con stdout y stderr redirigidos a un archivo de registro
Problema común: La redirección de salida (>>, 2>&1) se omite con frecuencia en las entradas de crontab. Sin ella, cron intenta enviar la salida por correo electrónico al usuario local mediante sendmail. En servidores sin un agente de transferencia de correo, esto descarta silenciosamente toda la salida y hace que la depuración sea casi imposible. Siempre redirija o establezca MAILTO="" al inicio del crontab.
2. Listar trabajos Cron de otro usuario
Con sudo o acceso root, puede inspeccionar el crontab de cualquier usuario:
sudo crontab -l -u johnReemplace john con el nombre de usuario de destino. Esto es funcionalmente idéntico a leer el archivo spool sin procesar, pero utiliza el mecanismo de bloqueo adecuado, por lo que siempre es preferible al acceso directo a archivos.
3. Listar todos los crontabs de usuario a la vez
En un servidor multiusuario, iterar sobre cada cuenta es la única forma confiable de obtener una imagen completa:
for user in $(cut -f1 -d: /etc/passwd); do
echo "=== Crontab for: $user ==="
sudo crontab -l -u "$user" 2>/dev/null
doneEl 2>/dev/null suprime los mensajes de "no crontab for" para los usuarios que no tienen ninguno, manteniendo la salida limpia.
4. Ver el Crontab de todo el sistema
cat /etc/crontabUna salida típica en un sistema basado en Debian:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )Observe el guard test -x /usr/sbin/anacron: si anacron está instalado, estas llamadas run-parts se omiten y anacron asume la responsabilidad de los trabajos diarios, semanales y mensuales. Esta es una fuente común de confusión cuando los trabajos parecen no ejecutarse según lo programado.
5. Listar trabajos en /etc/cron.d/
ls -la /etc/cron.d/Para inspeccionar el contenido de cada archivo en el directorio en un solo paso:
grep -v '^#|^$' /etc/cron.d/*Esto elimina las líneas de comentarios y las líneas en blanco, mostrando solo las definiciones de trabajos activos. Los gestores de paquetes frecuentemente colocan archivos aquí — ejemplos comunes incluyen sysstat, anulaciones de logrotate y agentes de monitoreo.
6. Inspeccionar el directorio Spool de Cron directamente
ls -la /var/spool/cron/crontabs/En RHEL, CentOS y Fedora, la ruta es /var/spool/cron/ sin el subdirectorio crontabs. Para leer el archivo spool sin procesar de un usuario específico:
sudo cat /var/spool/cron/crontabs/usernameImportante: Nunca edite los archivos spool directamente con un editor de texto. El comando crontab -e utiliza bloqueo de archivos y valida la sintaxis antes de instalar el nuevo archivo. Las ediciones directas pueden corromper el archivo o dejarlo en un estado en el que crond lo ignore por completo.
7. Listar trabajos de Anacron
Si el sistema utiliza anacron para una programación resiliente:
cat /etc/anacrontabLas entradas de Anacron utilizan una sintaxis diferente — período en días, retraso en minutos, identificador de trabajo y comando — en lugar del formato estándar de cron de cinco campos.
8. Verificar temporizadores Systemd (alternativa moderna)
En distribuciones basadas en systemd, muchas tareas que históricamente eran gestionadas por cron ahora son manejadas por temporizadores systemd. Estos no aparecerán en ningún listado de crontab:
systemctl list-timers --allUna auditoría completa del servidor debe incluir tanto verificaciones de cron como de temporizadores systemd. No hacerlo es una de las brechas más comunes en las revisiones de seguridad y cumplimiento.
Auditoría completa de Cron: comando de un solo paso
Para una auditoría rápida y completa de cada tarea programada en un sistema, combine todas las fuentes:
echo "=== /etc/crontab ===" && cat /etc/crontab
echo "=== /etc/cron.d/ ===" && ls /etc/cron.d/ && grep -rh '' /etc/cron.d/
echo "=== User crontabs ===" && for u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null && echo " ^ user: $u"; done
echo "=== Systemd timers ===" && systemctl list-timers --all --no-pagerEditar y gestionar trabajos Cron
Para abrir su propio crontab en el editor predeterminado del sistema ($VISUAL o $EDITOR, con respaldo en vi):
crontab -ePara editar el crontab de otro usuario como root:
sudo crontab -e -u usernamePara eliminar todos los trabajos cron del usuario actual (usar con precaución — esto es irreversible sin una copia de seguridad):
crontab -rPara hacer una copia de seguridad de un crontab antes de realizar cambios:
crontab -l > ~/crontab_backup_$(date +%F).txtSiempre haga una copia de seguridad antes de editar. No hay función de deshacer integrada en crontab -e.
Cron vs. temporizadores Systemd: comparación de características
| Característica | Cron | Temporizadores Systemd |
|---|---|---|
| Formato de configuración | Texto plano, sintaxis de cinco campos | Archivos de unidad (.timer + .service) |
| Programación por usuario | Sí, mediante crontabs de usuario | Sí, mediante instancias systemd a nivel de usuario |
| Manejo de trabajos perdidos | No (el trabajo se omite si el sistema está apagado) | Sí, con Persistent=true |
| Registro | Syslog / correo | Journald (consultable con journalctl) |
| Gestión de dependencias | Ninguna | Grafo completo de dependencias systemd |
| Retraso aleatorio | No nativo (requiere sleep $RANDOM) | RandomizedDelaySec= |
| Complejidad | Baja | Moderada |
| Disponibilidad | Todos los sistemas Unix/Linux | Solo Linux basado en systemd |
Para la automatización sencilla basada en tiempo en cualquier sistema Unix — incluidos entornos heredados y contenedores — cron sigue siendo la opción más portable y operacionalmente simple. Los temporizadores systemd son superiores cuando se necesita ordenamiento de dependencias, ejecución confiable de trabajos perdidos o salida de registro estructurada.
Comandos comunes para listar Crontab: referencia rápida
| Objetivo | Comando |
|---|---|
| Listar trabajos del usuario actual | crontab -l |
| Listar trabajos de otro usuario | sudo crontab -l -u username |
| Listar trabajos de todos los usuarios | for u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null; done |
| Ver crontab del sistema | cat /etc/crontab |
| Listar trabajos de cron.d | ls /etc/cron.d/ |
| Ver directorio spool | ls /var/spool/cron/crontabs/ |
| Ver trabajos de anacron | cat /etc/anacrontab |
| Listar temporizadores systemd | systemctl list-timers --all |
| Editar crontab del usuario actual | crontab -e |
| Eliminar crontab del usuario actual | crontab -r |
Problemas comunes y casos extremos del mundo real
Las variables de entorno no se heredan. Cron ejecuta trabajos en un entorno de shell mínimo. Variables como PATH, HOME y LANG que están definidas en su .bashrc o .profile no están disponibles. Siempre use rutas absolutas para comandos y binarios, o defina explícitamente PATH al inicio del crontab.
La variable MAILTO controla el enrutamiento de la salida. Establezca MAILTO="" para descartar la salida, o MAILTO="admin@example.com" para enrutarla a una dirección específica. Sin un MTA configurado, la salida no gestionada provoca fallos silenciosos.
Los permisos en los scripts importan. Un script que se ejecuta correctamente de forma interactiva puede fallar bajo cron si no es ejecutable (chmod +x) o si hace referencia a archivos que el usuario de cron no puede leer.
Ejecución superpuesta de trabajos. Si un trabajo tarda más que su intervalo, se ejecutarán múltiples instancias de forma concurrente. Use un archivo de bloqueo o flock para evitar esto:
0 * * * * /usr/bin/flock -n /tmp/myjob.lock /home/user/long-running-job.shConciencia de zona horaria. Cron utiliza la zona horaria del sistema de forma predeterminada. En servidores con UTC configurado como reloj del sistema — lo cual es práctica estándar en VPS Hosting y Servidores Dedicados — asegúrese de que sus tiempos programados tengan en cuenta el desfase. Algunas implementaciones de cron admiten una variable CRON_TZ por crontab.
Validación de sintaxis de Crontab. Antes de implementar una nueva entrada de crontab en producción, valide la expresión usando una herramienta como crontab.guru para confirmar que el horario coincide con su intención.
Registro y depuración de trabajos Cron
De forma predeterminada, cron registra la ejecución de trabajos en syslog. Para ver la actividad reciente de cron:
grep CRON /var/log/syslog | tail -50En sistemas basados en systemd:
journalctl -u cron --since "1 hour ago"Si un trabajo no se está ejecutando, verifique:
- El daemon cron está activo:
systemctl status cron(ocronden sistemas basados en RHEL) - El script es ejecutable y la ruta es correcta
- Los campos de tiempo son sintácticamente válidos
- La salida no se descarta silenciosamente — agregue
>> /tmp/job.log 2>&1temporalmente - El usuario que ejecuta el trabajo tiene permiso para ejecutar el comando
Al gestionar stacks de automatización complejos en un VPS con cPanel, cPanel proporciona una interfaz gráfica de Trabajos Cron en la sección Avanzado, que escribe directamente en el crontab del usuario. Los trabajos añadidos mediante cPanel son completamente visibles con crontab -l y se comportan de manera idéntica a las entradas añadidas manualmente.
Matriz de decisión: qué capa de Cron usar
| Caso de uso | Capa recomendada |
|---|---|
| Automatización personal para un solo usuario | Crontab de usuario (crontab -e) |
| Tareas de mantenimiento del sistema (copias de seguridad, rotación de registros) | /etc/cron.d/ o /etc/crontab |
| Scripts que deben ejecutarse incluso después de una programación perdida | Anacron (/etc/anacrontab) |
| Tareas con dependencias complejas u ordenamiento de servicios | Temporizadores systemd |
| Trabajos a nivel de aplicación implementados con un paquete | /etc/cron.d/<package-name> |
| Entornos en contenedores | Supervisor + cron, o Kubernetes CronJob |
Lista de verificación de puntos clave prácticos
- Ejecute
crontab -lpara auditar sus propios trabajos; use el patrón de bucleforpara auditar cada usuario en un servidor multiusuario. - Siempre verifique
/etc/crontab,/etc/cron.d/ysystemctl list-timers --all—crontab -lpor sí solo ofrece una imagen incompleta. - Use rutas absolutas para todos los comandos y binarios dentro de las entradas de crontab.
- Establezca
MAILTO=""o redirija la salida explícitamente para evitar fallos silenciosos en servidores sin un MTA. - Haga una copia de seguridad de su crontab con
crontab -l > backup.txtantes de cualquier sesión de edición. - Use
flockpara evitar la ejecución concurrente de trabajos de larga duración. - En sistemas systemd, verifique
journalctl -u cronen lugar de depender únicamente de/var/log/syslog. - Valide las nuevas expresiones de tiempo con un comprobador de expresiones cron en línea antes de implementarlas en producción.
- Tenga en cuenta UTC vs. zona horaria local en instancias de nube y VPS Hosting.
- Para servidores de Alojamiento de Correo Electrónico o cualquier infraestructura donde los trabajos sean de misión crítica, implemente monitoreo externo (por ejemplo, pings de verificación de estado) para detectar fallos silenciosos de cron.
Preguntas frecuentes
¿Cómo listo todos los trabajos cron de cada usuario en un servidor Linux?
Itere sobre /etc/passwd y llame a sudo crontab -l -u <user> para cada cuenta, suprimiendo los errores de "no crontab" con 2>/dev/null. Además, inspeccione /etc/crontab, /etc/cron.d/ y ejecute systemctl list-timers --all para capturar trabajos a nivel de sistema y gestionados por systemd.
¿Por qué crontab -l no muestra nada aunque los trabajos se están ejecutando?
Los trabajos probablemente están definidos en /etc/crontab, un archivo dentro de /etc/cron.d/, o como temporizadores systemd — ninguno de los cuales es visible mediante crontab -l. Ese comando solo muestra el crontab personal del usuario que llama, almacenado en el directorio spool.
¿Cuál es la diferencia entre /etc/crontab y /etc/cron.d/?
Ambos utilizan la misma sintaxis de seis campos (incluido el campo de nombre de usuario) y son leídos por el daemon cron del sistema. /etc/crontab es un archivo monolítico único destinado a la administración manual del sistema. /etc/cron.d/ es un directorio drop-in donde los paquetes o servicios individuales instalan sus propios archivos de trabajos, manteniéndolos aislados y más fáciles de gestionar o eliminar de forma independiente.
¿Cómo evito que un trabajo cron ejecute múltiples instancias superpuestas?
Envuelva el comando con flock -n /tmp/lockfile.lock para adquirir un bloqueo exclusivo no bloqueante. Si una instancia anterior todavía está en ejecución, la nueva invocación sale inmediatamente sin ejecutar el comando, evitando la contención de recursos y la corrupción de datos.
¿Dónde se almacenan los registros de trabajos cron y cómo depuro un trabajo que no se está ejecutando?
En la mayoría de los sistemas, cron registra en /var/log/syslog (filtre con grep CRON) o mediante journald (journalctl -u cron). Para depurar, agregue temporalmente >> /tmp/debug.log 2>&1 al comando del trabajo para capturar toda la salida, verifique que el script sea ejecutable, confirme que el daemon esté en ejecución con systemctl status cron y valide la expresión de tiempo de forma independiente.
