Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: https://www.alcancelibre.org
Licencia Creative Commons
© 1999-2026 Joel Barrios Dueñas. Este manual se distribuye bajo la licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional (CC BY-NC-SA 4.0). Usted es libre de compartir y adaptar el material bajo los siguientes términos: debe dar crédito al autor, no puede utilizarlo para fines comerciales y debe compartir las obras derivadas bajo la misma licencia. La licencia completa está disponible en https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.es.
El servicio atd es el servicio responsable de ejecutar tareas programadas para una sola ocasión en un momento específico o cuando la carga del sistema lo permita. Este manual cubre su configuración, uso y aspectos de seguridad fundamentales para administradores de sistemas.
Tanto at como batch se utilizan para programar la ejecución de mandatos de una sola ocasión. En el caso de que se requiera programar mandatos para ser ejecutados periódicamente, se sugiere hacerlo a través de crontab.
Ambos interpretan otros mandatos directamente desde la entrada estándar (STDIN) o a partir de un archivo especificado. Mientras que at permite especificar que un mandato sea ejecutado a una hora y fecha específicos, batch permite ejecutar éste sólo cuando descienden los niveles de carga de trabajo del sistema hasta un nivel en particular. Ambos utilizan el intérprete de mandatos del sistema.
El servicio atd está ausente en la instalación predeterminada de los sistemas operativos modernos.
Si utiliza Fedora, Red Hat™ Enterprise Linux, AlmaLinux o Rocky Linux y sus derivados, ejecute lo siguiente para instalar el paquete at:
dnf -y install at
Para iniciar el servicio por primera vez, en caso de que recién se haya instalado atd, ejecute:
systemctl enable --now atd
Si utiliza ALDOS, ejecute lo siguiente para instalar el paquete at:
yum -y install at
Para iniciar el servicio por primera vez, en caso de que recién se haya instalado atd, ejecute:
chkconfig atd on
service atd start
Salvo que se haya hecho algún cambio en el archivo /etc/sysconfig/atd ―como por ejemplo para añadir algún argumento al inicio del servicio― es innecesario reiniciar el servicio si añade una tarea programada. La ejecución de los mandatos programados se realiza leyendo y procesando el contenido de los archivos y directorios de configuración.
A continuación se detallan los archivos de control, la ubicación de las tareas y el uso de los mandatos principales para gestionar trabajos programados.
El archivo /etc/at.deny se utiliza para definir una lista de usuarios a los cuales se les denegará el uso de at. Cuando este archivo está vacío, implica que todos los usuarios del sistema pueden hacer uso de at.
El archivo /etc/at.allow es inexistente de modo predeterminado. Cuando éste existe, sólo los usuarios listados en su interior pueden hacer uso de at.
En ausencia del archivo /etc/at.allow, el sistema utilizará siempre /etc/at.deny para el control de acceso para at.
En ausencia de los archivos /etc/at.allow y /etc/at.deny, sólo el usuario root puede hacer uso de at.
Todos los mandatos programados con at y batch se almacenan dentro del directorio /var/spool/at.
Puede utilizar at para ejecutar mandatos a una determinada hora y fecha.
Puede ingresar tiempos para at en el formato HH:MM. Cuando se ejecuta con una hora que ya ha pasado, el sistema asume que se refiere al día siguiente. También se pueden especificar valores como midnight (media noche, 00:00), noon (12:00) o teatime (16:00). Ejemplo:
at 17:30
Para especificar la fecha se utiliza el formato nombre-del-mes día, siempre y cuando se especifique después de la hora de ejecución. Ejemplo:
at 18:20 Sep 27
Opcionalmente también se puede definir el año. Ejemplo:
at 18:20 Sep 27 2025
También se puede especificar en el formato MMDDAAAA, MM/DD/AAAA o DD.MM.AAAA. Ejemplos:
at 10:30 01152026
at 10:30 01/15/2026
at 10:30 15.01.2026
Los tres ejemplos anteriores ejecutan algo el 15 de enero de 2026 a las 10:30 AM.
También es posible utilizar una hora específica y establecer si se ejecuta ahora (now) más unidades de tiempo, como horas (hours), días (days) y semanas (weeks). Ejemplo:
at 10:30 now + 15 days
Lo anterior establece que se ejecute algo a las 10:30 AM dentro de 15 días.
at 10:30 now + 6 weeks
Lo anterior establece que se ejecute algo a las 10:30 AM dentro de 6 semanas.
También permite establecer la ejecución utilizando today (hoy) y tomorrow (mañana) como argumentos. Ejemplo:
at 12:25 tomorrow
El formato completo para la definición de tiempo se puede consultar examinando el contenido del archivo /usr/share/doc/at/timespec.
Una vez que se ejecuta at con alguna hora en particular, se escribe en pantalla el mandato o conjunto de mandatos deseados. Pulse Ctrl + D para guardar los cambios y salir del intérprete de mandatos de at.
Utilizando la opción -f se puede utilizar un archivo específico en lugar de la entrada estándar.
at 10:30 today -f /home/usuario/bin/trabajo.sh
Que es lo mismo que ejecutar lo siguiente:
at 10:30 today < /home/usuario/bin/trabajo.sh
El manual completo de <kbd>at</kbd> puede consultarse ejecutando lo siguiente:
man 1 at
### Uso de batch.
Puede utilizar <kbd>batch</kbd> para ejecutar mandatos cuando el nivel de carga del sistema cae por debajo de 0.8 o bien el valor que se especifique con <kbd>atrun</kbd>. Cabe señalar que <kbd>batch</kbd> sólo permite el uso de la opción <kbd>-f</kbd> para definir el nombre de un archivo para ser utilizado en lugar de la entrada estándar. Ejemplo:
batch -f /home/usuario/bin/trabajo.sh
Lo anterior es lo mismo que ejecutar lo siguiente:
batch < /home/usuario/bin/trabajo.sh
Para cambiar el valor de la carga máximo para poder ejecutar los mandatos programados con batch, se ejecuta <kbd>atrun</kbd> con la opción <kbd>-l</kbd> y el valor de carga deseado. Ejemplo:
atrun -l 0.9
### Uso de atq.
Puede ejecutar <kbd>atq</kbd> para mostrar una lista de todos los mandatos pendientes. Cuando se ejecuta como usuario regular muestra exclusivamente los mandatos pendientes de ese usuario en particular. Ejemplo:
atq
La salida de lo anterior ―cuando hay mandatos pendientes― puede ser similar a la siguiente.
7 Tue Sep 25 14:30:00 2025 a fulano 5 Thu Jan 15 10:30:00 2026 a fulano 8 Wed Sep 26 14:30:00 2025 a root 6 Thu Jan 15 10:30:00 2026 a zutano
> ⚠️ **Nota de Seguridad para Administradores**: El servicio `atd` es una herramienta poderosa que, en manos equivocadas, puede configurar tareas con ejecución diferida. Por su naturaleza, estas tareas pueden pasar desapercibidas. Es **crucial** verificar periódicamente la cola de trabajos pendientes ―especialmente al heredar la administración de un servidor configurado por otra persona― utilizando `atq` o `at -l`. Esta práctica simple puede prevenir incidentes graves, como la ejecución de mandatos maliciosos programados para activarse mucho tiempo después de que un usuario haya abandonado el sistema.
Cabe señalar que <kbd>atq</kbd> es en realidad un atajo de <kbd>at</kbd> con la opción <kbd>-l</kbd>.
at -l
Lo anterior mostrará todos los mandatos pendientes de todos los usuarios cuando se ejecuta como root.
### Uso de atrm.
Puede utilizar <kbd>atrm</kbd> para eliminar mandatos pendientes, utilizando el número de mandato como argumento. Ejemplo:
atrm 2
Lo anterior es lo mismo que ejecutar lo siguiente:
at -d 2