Automatizar tareas con at: Guía completa 2026

automatizacion-de-tareas-con-at
automatizacion-de-tareas-con-at

En este post veremos como automatizar tareas con at, a veces solo necesitas que un comando se ejecute una vez: dentro de diez minutos, esta noche, mañana por la mañana o en una fecha concreta. Para ese tipo de casos existe at, una herramienta clásica, sencilla y muy útil para programar tareas puntuales.

El comando at permite indicar una hora futura y dejar preparados uno o varios comandos para que el sistema los ejecute automáticamente cuando llegue ese momento. Es una alternativa más directa que cron cuando la tarea no tiene que repetirse.

En esta guía aprenderás como automatizar tareas con at, cómo instalarlo, cómo activar su servicio, cómo programar trabajos, cómo revisar la cola, cómo cancelar tareas, qué problemas suelen aparecer con rutas y variables de entorno, cómo guardar la salida en logs y cuándo conviene usar at frente a cron o systemd timers.

👉 Y recuerda, si quieres aprender más de Linux, pincha en este curso de Linux gratis

👉 También te dejo por aquí una guía de comandos Linux por categorías

Qué es el comando at

Cuando necesitas automatizar tareas con at, puedes programar comandos o scripts en Linux para que se ejecuten una única vez en una fecha y hora concretas.

Por ejemplo, puedes usarlo para:

  • apagar el equipo esta noche;
  • lanzar un script dentro de una hora;
  • ejecutar una copia de seguridad al final del día;
  • enviar un recordatorio por terminal;
  • procesar archivos cuando ya no estés delante del ordenador;
  • reiniciar un servicio durante una ventana de mantenimiento;
  • ejecutar una tarea pesada fuera del horario de trabajo.

La idea principal es simple: escribes at, indicas cuándo quieres ejecutar la tarea y después introduces los comandos. Linux guarda ese trabajo en una cola y el demonio atd se encarga de lanzarlo a la hora indicada.

Diferencia entre at y cron

La diferencia más importante es la frecuencia.

at sirve para tareas de una sola ejecución. Programas algo para un momento futuro y, cuando se ejecuta, el trabajo desaparece de la cola.

cron sirve para tareas repetitivas. Se usa cuando quieres ejecutar algo todos los días, cada lunes, cada hora, el primer día del mes o siguiendo otro patrón periódico.

Ejemplo típico para at:

echo "tar -czf /tmp/home-backup.tar.gz /home/usuario" | at 23:00

Ejemplo típico para cron:

0 23 * * * tar -czf /tmp/home-backup.tar.gz /home/usuario

En el primer caso, la copia se ejecuta una vez a las 23:00. En el segundo, se ejecuta todos los días a las 23:00.

Instalar at en Linux

En muchas distribuciones at puede venir instalado, pero no siempre está activo. Lo primero es comprobar si el comando existe:

at -V

Si el sistema responde con una versión, ya está instalado. Si aparece un mensaje como command not found, instálalo con el gestor de paquetes de tu distribución.

En Debian, Ubuntu y derivadas:

sudo apt update
sudo apt install at

En Fedora:

sudo dnf install at

En Arch Linux:

sudo pacman -S at

En openSUSE:

sudo zypper install at

Después de instalarlo, necesitas asegurarte de que el servicio atd está activo.

Activar y comprobar el servicio atd

at no ejecuta los trabajos por sí solo. Quien revisa la cola y lanza las tareas es el servicio atd.

En sistemas con systemd, puedes activarlo así:

sudo systemctl enable --now atd

Para comprobar su estado:

systemctl status atd

Si está funcionando correctamente, deberías ver el servicio como active (running).

En algunas distribuciones el servicio puede llamarse de forma ligeramente distinta, aunque lo habitual es atd. Si el comando anterior falla, puedes buscar unidades relacionadas:

systemctl list-unit-files | grep -i atd

Si atd no está activo, los trabajos pueden quedar en cola pero no ejecutarse cuando llegue la hora. Por eso este paso es fundamental.

Sintaxis básica de at

La forma más común de usar at es:

at HORA

Después de ejecutar ese comando, at abre un pequeño prompt interactivo. Ahí escribes los comandos que quieres programar. Cuando termines, pulsa Ctrl+D.

Ejemplo:

at 18:30

El prompt cambia a:

at>

Ahora puedes escribir:

echo "Tarea ejecutada" >> /tmp/tarea-at.log

Y finalizar con Ctrl+D.

El sistema mostrará un mensaje parecido a:

job 3 at Thu Jul  2 18:30:00 2026

Ese número de trabajo es importante porque te permite identificarlo después en la cola.

Programar comandos con echo y tuberías

Aunque el modo interactivo es útil para aprender, en la práctica muchas veces es más cómodo enviar el comando directamente con echo y una tubería:

echo "touch /tmp/archivo-creado-por-at" | at now + 5 minutes

Ese comando programa la creación del archivo /tmp/archivo-creado-por-at dentro de cinco minutos.

También puedes programar varias instrucciones usando printf:

printf '%s\n' \
  'date >> /tmp/reporte-at.log' \
  'uptime >> /tmp/reporte-at.log' \
  'df -h >> /tmp/reporte-at.log' \
| at 22:00

Este ejemplo guarda fecha, carga del sistema y uso de disco en un archivo de log a las 22:00.

Formatos de hora aceptados por at

Una de las ventajas de at es que entiende muchos formatos de tiempo naturales.

Puedes usar horas exactas:

at 14:30

Puedes usar expresiones relativas:

at now + 10 minutes
at now + 2 hours
at now + 1 day
at now + 1 week

Puedes usar momentos del día:

at noon
at midnight
at teatime

teatime suele interpretarse como las 16:00.

También puedes combinar horas con fechas:

at 09:00 tomorrow
at 23:30 next Friday
at 10:00 2026-07-10

En algunos sistemas, el formato exacto de fecha aceptado puede variar según la implementación y la configuración regional. Si tienes dudas, prueba primero con una tarea inofensiva:

echo "date >> /tmp/prueba-at.log" | at now + 1 minute

Ejecutar un script más tarde

Supongamos que tienes un script llamado /home/ana/scripts/limpieza.sh y quieres ejecutarlo dentro de una hora.

Primero asegúrate de que el script tiene permisos de ejecución:

chmod +x /home/ana/scripts/limpieza.sh

Después prográmalo:

echo "/home/ana/scripts/limpieza.sh" | at now + 1 hour

Usar la ruta absoluta del script es una buena práctica. Los trabajos ejecutados por at no siempre tienen el mismo entorno que tu terminal interactiva.

Apagar el equipo a una hora concreta

Para apagar el equipo a las 23:30:

echo "shutdown -h now" | sudo at 23:30

Aquí hay un detalle importante: si el comando necesita privilegios de administrador, debes programarlo con el usuario adecuado. En este caso se usa sudo at, no solo sudo shutdown dentro del trabajo.

También puedes programar un reinicio:

echo "reboot" | sudo at 03:00

Antes de automatizar apagados o reinicios, conviene revisar si hay otros usuarios conectados o procesos críticos en ejecución.

Crear un recordatorio simple

Puedes usar at como recordatorio local:

echo "notify-send 'Descanso' 'Levántate y estira un poco'" | at now + 45 minutes

Este ejemplo depende de que notify-send funcione en tu sesión gráfica. En algunos escritorios puede fallar si el trabajo no tiene acceso a las variables de entorno de la sesión gráfica, como DISPLAY o DBUS_SESSION_BUS_ADDRESS.

Para recordatorios más robustos en servidores o terminales, es mejor escribir en un archivo:

echo "echo 'Revisar backup' >> /home/ana/recordatorios.txt" | at 17:00

Ver trabajos pendientes con atq

Para ver las tareas programadas pendientes, usa:

atq

La salida puede ser similar a:

3       Thu Jul  2 18:30:00 2026 a ana
4       Thu Jul  2 22:00:00 2026 a ana

Cada línea muestra el identificador del trabajo, la fecha de ejecución, la cola y el usuario.

El identificador es el número que necesitarás si quieres cancelar una tarea.

Ver el contenido de un trabajo programado

En muchos sistemas puedes inspeccionar un trabajo pendiente con:

at -c 3

Donde 3 es el número del trabajo.

La salida incluye bastante información porque at guarda también parte del entorno. Al final verás los comandos que se ejecutarán.

Esto es muy útil cuando no recuerdas exactamente qué programaste o quieres comprobar si usaste rutas correctas.

Cancelar trabajos con atrm

Para eliminar un trabajo pendiente, usa atrm seguido del identificador:

atrm 3

Después puedes confirmar que ya no está en cola:

atq

También existe el comando at -d, que suele funcionar como equivalente:

at -d 3

atrm resulta más claro porque su nombre expresa directamente la acción: eliminar un trabajo de at.

Rutas absolutas y entorno de ejecución

Uno de los errores más comunes al automatizar tareas con ates asumir que el trabajo se ejecutará exactamente igual que en tu terminal.

En realidad, un trabajo de at puede tener un entorno distinto:

  • puede no estar en el mismo directorio;
  • puede tener un PATH más limitado;
  • puede no cargar los alias de tu shell;
  • puede no tener acceso a variables de sesión gráfica;
  • puede ejecutarse sin la misma interacción que tienes en la terminal.

Por eso conviene usar rutas absolutas:

echo "/usr/bin/python3 /home/ana/proyectos/reporte/generar.py" | at 20:00

Mejor que:

echo "python3 generar.py" | at 20:00

Si necesitas trabajar en un directorio concreto, indícalo explícitamente:

echo "cd /home/ana/proyectos/reporte && /usr/bin/python3 generar.py" | at 20:00

También puedes definir variables dentro del propio trabajo:

printf '%s\n' \
  'export APP_ENV=production' \
  'cd /home/ana/app' \
  '/usr/bin/php artisan report:send' \
| at 06:00 tomorrow

Redirigir salida y errores a un log

Cuando un trabajo de at falla, puede que no veas el error en pantalla porque la tarea se ejecuta en segundo plano y en otro momento. Por eso es recomendable redirigir la salida estándar y la salida de error a un archivo.

Ejemplo:

echo "/home/ana/scripts/backup.sh >> /home/ana/logs/backup-at.log 2>&1" | at 23:00

La parte importante es:

>> /home/ana/logs/backup-at.log 2>&1

Esto añade la salida normal al log y también envía los errores al mismo archivo.

Para scripts importantes, puedes crear una estructura más legible:

printf '%s\n' \
  'LOG=/home/ana/logs/mantenimiento-at.log' \
  'echo "Inicio: $(date)" >> "$LOG"' \
  '/home/ana/scripts/mantenimiento.sh >> "$LOG" 2>&1' \
  'echo "Fin: $(date)" >> "$LOG"' \
| at 01:00

Así tendrás marcas de inicio y fin para saber cuándo se ejecutó la tarea.

Permisos con at.allow y at.deny

El acceso a at puede estar controlado por dos archivos:

/etc/at.allow
/etc/at.deny

La lógica habitual es:

  • si existe /etc/at.allow, solo los usuarios listados en ese archivo pueden usar at;
  • si no existe /etc/at.allow, se revisa /etc/at.deny;
  • si el usuario aparece en /etc/at.deny, no puede usar at;
  • si ninguno de los dos archivos bloquea al usuario, normalmente puede usarlo.

Esto puede variar ligeramente según la distribución, pero el patrón general es ese.

Para permitir explícitamente a un usuario:

echo "ana" | sudo tee -a /etc/at.allow

Para bloquearlo:

echo "ana" | sudo tee -a /etc/at.deny

No edites estos archivos sin entender el impacto. En sistemas compartidos, controlar quién puede programar tareas es una medida básica de seguridad.

Cuándo usar at o cron

Usa at cuando la tarea sea puntual:

echo "/home/ana/scripts/reporte.sh" | at 18:00

Usa cron cuando la tarea sea periódica y sencilla:

0 18 * * * /home/ana/scripts/reporte.sh

Una forma práctica de decidir:

  • si ocurre una sola vez, piensa en at;
  • si ocurre de forma repetida con una regla simple, piensa en cron;

Conclusión

Recuerda que automatizar tareas con at en muy práctica para automatizar tareas puntuales en Linux. Su mayor valor está en la simplicidad: eliges un momento futuro, escribes los comandos y el sistema los ejecuta una sola vez.

Para usarlo bien, recuerda tres ideas clave. Primero, el servicio atd debe estar instalado y activo. Segundo, los trabajos programados no siempre heredan el mismo entorno que tu terminal, así que conviene usar rutas absolutas y definir lo necesario dentro del propio comando. Tercero, redirigir la salida a logs facilita mucho la depuración. Con estos pasos podrás automatizar tareas con at de forma natural.

Cuando necesitas una tarea única, automatizar tareas con at suele ser la opción más rápida y clara. Para tareas repetitivas, cron sigue siendo más adecuado. Para automatizaciones integradas con servicios del sistema, merece la pena mirar systemd timers. Saber distinguir estos tres casos te permite automatizar con menos complejidad y más control.

Comentarios

No hay comentarios aún. ¿Por qué no comienzas el debate?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *