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:00Ejemplo típico para cron:
0 23 * * * tar -czf /tmp/home-backup.tar.gz /home/usuarioEn 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 -VSi 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 atEn Fedora:
sudo dnf install atEn Arch Linux:
sudo pacman -S atEn openSUSE:
sudo zypper install atDespué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 atdPara comprobar su estado:
systemctl status atdSi 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 atdSi 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 HORADespué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:30El prompt cambia a:
at>Ahora puedes escribir:
echo "Tarea ejecutada" >> /tmp/tarea-at.logY finalizar con Ctrl+D.
El sistema mostrará un mensaje parecido a:
job 3 at Thu Jul 2 18:30:00 2026Ese 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 minutesEse 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:00Este 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:30Puedes usar expresiones relativas:
at now + 10 minutes
at now + 2 hours
at now + 1 day
at now + 1 weekPuedes usar momentos del día:
at noon
at midnight
at teatimeteatime 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-10En 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 minuteEjecutar 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.shDespués prográmalo:
echo "/home/ana/scripts/limpieza.sh" | at now + 1 hourUsar 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:30Aquí 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:00Antes 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 minutesEste 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:00Ver trabajos pendientes con atq
Para ver las tareas programadas pendientes, usa:
atqLa salida puede ser similar a:
3 Thu Jul 2 18:30:00 2026 a ana
4 Thu Jul 2 22:00:00 2026 a anaCada 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 3Donde 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 3Después puedes confirmar que ya no está en cola:
atqTambién existe el comando at -d, que suele funcionar como equivalente:
at -d 3atrm 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:00Mejor que:
echo "python3 generar.py" | at 20:00Si necesitas trabajar en un directorio concreto, indícalo explícitamente:
echo "cd /home/ana/proyectos/reporte && /usr/bin/python3 generar.py" | at 20:00Tambié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 tomorrowRedirigir 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:00La parte importante es:
>> /home/ana/logs/backup-at.log 2>&1Esto 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:00Así 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.denyLa 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.allowPara bloquearlo:
echo "ana" | sudo tee -a /etc/at.denyNo 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:00Usa cron cuando la tarea sea periódica y sencilla:
0 18 * * * /home/ana/scripts/reporte.shUna 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.
