15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar
24.10.2024
1 +1

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 -e y 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 adicional user por 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:

AtajoEquivalenteSignificado
@rebootEjecutar una vez al inicio del daemon
@yearly0 0 1 1 *Una vez al año
@monthly0 0 1 * *El primer día de cada mes
@weekly0 0 * * 0Cada domingo a medianoche
@daily0 0 * * *Cada día a medianoche
@hourly0 * * * *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 -l

Esto 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>&1

En este ejemplo:

  • backup.sh se ejecuta cada día a medianoche
  • cleanup.sh se ejecuta cada domingo a las 02:30
  • health-check.sh se 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 john

Reemplace 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
done

El 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/crontab

Una 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/username

Importante: 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/anacrontab

Las 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 --all

Una 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-pager

Editar y gestionar trabajos Cron

Para abrir su propio crontab en el editor predeterminado del sistema ($VISUAL o $EDITOR, con respaldo en vi):

crontab -e

Para editar el crontab de otro usuario como root:

sudo crontab -e -u username

Para eliminar todos los trabajos cron del usuario actual (usar con precaución — esto es irreversible sin una copia de seguridad):

crontab -r

Para hacer una copia de seguridad de un crontab antes de realizar cambios:

crontab -l > ~/crontab_backup_$(date +%F).txt

Siempre 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ísticaCronTemporizadores Systemd
Formato de configuraciónTexto plano, sintaxis de cinco camposArchivos de unidad (.timer + .service)
Programación por usuarioSí, mediante crontabs de usuarioSí, mediante instancias systemd a nivel de usuario
Manejo de trabajos perdidosNo (el trabajo se omite si el sistema está apagado)Sí, con Persistent=true
RegistroSyslog / correoJournald (consultable con journalctl)
Gestión de dependenciasNingunaGrafo completo de dependencias systemd
Retraso aleatorioNo nativo (requiere sleep $RANDOM)RandomizedDelaySec=
ComplejidadBajaModerada
DisponibilidadTodos los sistemas Unix/LinuxSolo 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

ObjetivoComando
Listar trabajos del usuario actualcrontab -l
Listar trabajos de otro usuariosudo crontab -l -u username
Listar trabajos de todos los usuariosfor u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null; done
Ver crontab del sistemacat /etc/crontab
Listar trabajos de cron.dls /etc/cron.d/
Ver directorio spoolls /var/spool/cron/crontabs/
Ver trabajos de anacroncat /etc/anacrontab
Listar temporizadores systemdsystemctl list-timers --all
Editar crontab del usuario actualcrontab -e
Eliminar crontab del usuario actualcrontab -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.sh

Conciencia 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 -50

En sistemas basados en systemd:

journalctl -u cron --since "1 hour ago"

Si un trabajo no se está ejecutando, verifique:

  1. El daemon cron está activo: systemctl status cron (o crond en sistemas basados en RHEL)
  2. El script es ejecutable y la ruta es correcta
  3. Los campos de tiempo son sintácticamente válidos
  4. La salida no se descarta silenciosamente — agregue >> /tmp/job.log 2>&1 temporalmente
  5. 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 usoCapa recomendada
Automatización personal para un solo usuarioCrontab 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 perdidaAnacron (/etc/anacrontab)
Tareas con dependencias complejas u ordenamiento de serviciosTemporizadores systemd
Trabajos a nivel de aplicación implementados con un paquete/etc/cron.d/<package-name>
Entornos en contenedoresSupervisor + cron, o Kubernetes CronJob

Lista de verificación de puntos clave prácticos

  • Ejecute crontab -l para auditar sus propios trabajos; use el patrón de bucle for para auditar cada usuario en un servidor multiusuario.
  • Siempre verifique /etc/crontab, /etc/cron.d/ y systemctl list-timers --allcrontab -l por 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.txt antes de cualquier sesión de edición.
  • Use flock para evitar la ejecución concurrente de trabajos de larga duración.
  • En sistemas systemd, verifique journalctl -u cron en 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.

15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar