at
El comando at (paquete at) hace uso del demonio atd y lee comandos de la entrada estándar (hasta pulsar control+D) o de un fichero y los ejecuta una sola vez a la hora especificada.
Podemos ver el estado del demonio atd así:
# service atd status
● atd.service - Deferred execution scheduler
Loaded: loaded (/lib/systemd/system/atd.service; enabled)
Active: active (running) since lun 2015-12-07 09:52:51 CET; 10h ago
Docs: man:atd(8)
Main PID: 549 (atd)
CGroup: /system.slice/atd.service
└─549 /usr/sbin/atd -f
# systemctl status atd.service
# /etc/init.d/atd status
La sintaxis del comando es:
at [ -f fichero ] momento
El momento en que se ejecutará la orden se puede especificar de varias formas, se puede consultar el fichero /usr/share/doc/at/timespec que contiene una información más detallada de los formatos posibles.
Para las horas se pueden usar los siguientes formatos:
HH | A la hora en punto indicada. |
HH:MM | En la hora y minuto especificado. |
midnight | A las 00:00. |
noon | A las 12:00. |
teatime | A las 16:00. |
HH:MMam | A una hora y minuto de la mañana. |
HH:MMpm | A una hora y minuto de la tarde. |
now | En este preciso momento. |
Cuando solo se da una hora, se refiere al día actual, a menos que dicha hora haya pasado y se referirá entonces al día siguiente.
En caso de que no queramos programar para el día actual, se puede especificar una hora seguida de una fecha. Las formas de especificar fechas son:
MMDDYY MMDDYYYY |
Mes, día y año. |
MM/DD/YY MM/DD/YYYY |
Mes, día y año. |
DD.MM.YY DD.MM.YYYY |
Día, mes y año. |
today | Hoy. |
tomorrow | Mañana. |
También se pueden sumar o restar tiempos a un momento determinado. Las unidades de la cantidad a sumar o restar pueden ser:
minute, minutes, hour, hours, day, days, week, weeks, month, months, year, years
El trabajo programado con at se ejecuta con la shell y el directorio activo donde se creó. La salida se envía al correo del usuario que ejecuta el comando a menos que usemos redirecciones, siendo esto último lo más habitual.
Es importante recordar que si el ordenador se apaga, las tareas programadas con at se borran.
Ejemplos:
at -f script-parada 20:30 | Ejecuta un script que para un servicio a las ocho y media de la tarde. |
at -f script-activacion 10:00 30.10.15 |
Ejecuta un script que activa un servicio el 30 de octubre de 2015 a las diez de la mañana. |
at -f script-migracion 11:30 +4 days | Ejecuta un script dentro de cuatro días a las once y media de la mañana. |
at -f script-migracion now +4 days | Ejecuta un script justo dentro de cuatro días. |
Si no usamos la opción -f, entraremos en el entorno de at, donde podremos escribir las líneas de comandos que queramos:
# at 09:10
warning: commands will be executed using /bin/sh
at>
Debemos pulsar ctrl+D (marca EOF) en una línea vacía para finalizar la introducción de los comandos, y estos se ejecutarán en el momento establecido.
Existe varias colas a donde enviar las tareas, por defecto, los comandos programados con at se envían a la cola a. Las colas se especifican con una simple letra, y pueden ser los rangos a-z y A-Z. Las colas de letras superiores tienen prioridad sobre las inferiores, y a las colas con letras en mayúscula se le aplica el mismo criterio de carga del comando batch cuando llega el momento de su ejecución.
Para especificar una cola concreta utilizaremos la opción -q:
# at -f tareas.at -q h now +2 hours
Podemos ver un listado de las tareas activas con atq o at -l:
# atq
12 Mon Dec 7 22:11:00 2015 a root
10 Tue Dec 8 01:59:00 2015 a root
11 Tue Dec 8 22:00:00 2015 a root
En este listado aparece el número de la tarea, su fecha y hora de ejecución y el usuario que la ejecutará. Cuando lo ejecuta el root el listado es de las tareas de todos los usuarios, y si lo ejecuta cualquier otro usuario, solo salen sus propias tareas.
Los comandos enviados con at se almacenan en el directorio /var/spool/cron/atjobs.
Es posible que queramos recordar lo que hace una de las tareas listadas, o consultar el valor de alguna de las variables que se usarán en el entorno de ejecución de dicha tarea. Para ello solicitaremos los detalles de una tarea con la opción -c del comando at:
# at -c 12
#!/bin/sh
# atrun uid=1000 gid=1000
# mail usuario 0
umask 22
SESSION_MANAGER=local/portatilmdc:@/tmp/.ICE-unix/1206,unix/portatilmdc:/tmp/.ICE-unix/1206; export SESSION_MANAGER
WINDOWID=52428806; export WINDOWID
QT_ACCESSIBILITY=1; export QT_ACCESSIBILITY
...
...
QT_FONT_DPI=96; export QT_FONT_DPI
QT_SCALE_FACTOR=1; export QT_SCALE_FACTOR
cd /home/usuario || {
echo 'Execution directory inaccessible' >&2
exit 1
}
/usr/bin/date > /home/usuario/date.txt
La opción -m indica que se envíe un correo electrónico siempre que una tarea finalice.
Se pueden borrar las tareas con atrm, at -r ó at -d, seguido de uno o más números de tarea.
# atrm 10 11 12
Tanto para listar como para borrar tareas, se puede especificar una cola concreta con la opción -q, y como se ha dicho ya, la cola por defecto que usan estos comandos es la a.
Para limitar el uso de at, existe una lista blanca (/etc/at.allow) y una lista negra (/etc/at.deny), con igual funcionamiento al que vimos con las mismas listas de cron, con la excepción de que si no existen ninguno de los ficheros, en Debian, at solo estará disponible para el root, aunque en otros sistemas puede ser al contrario.
Obra publicada con Licencia Creative Commons Reconocimiento 4.0