Programación de tareas en Linux. Comando 'at'

Linux Nivel Medio 5 de feb. de 2023

Diferencias entre contrab y at

Para programar tareas en GNU/Linux disponemos de dos herramientas:
- crontab
- at

crontab: Ejecuciones periódicas de uno o varios procesos.
at: Una unica ejecución de uno o varios procesos.

crontab: No mantiene el "entorno" en la ejecución.
at: Mantiene las variables de entorno y ruta de ejecución actual, así como cualquier otra variable definida en ese momento.

crontab: Es el más usado y conocido. Hay mucha documentacion sobre él.
at: Es un desconocido, pero que aporta grandes posibilidades.

crontab: Su servicio implicado en su ejecucion es el cron.
at: El servicio que facilita su ejecución es el anacron.

Comandos relacionados con at

at

1) Ejecuta comandos en la fecha y hora especificados una única vez. Además permite enviar un email como recordatorio de la tarea.
2) Permite ver el contenido de la tarea que se vaya a ejecutar.

atq

Muestra la cola/lista de trabajos existentes en la lista de tareas  pendientes.
Comando alias de at -l

atrm

Permite eliminar una determinada tarea de la lista de tareas pendientes de ejecución.
Comando alias de at -r

Cómo crear una tarea única con at

Los pasos serían los siguientes:

1) Ejecutar el comando at indicando hora y día (opcional) en que se desee se ejecute la tarea.
2) Escribir cada comando a ejecutar en una línea, pulsar INTRO para finalizar la entrada de cada comando.
3) Finalizar la entrada de la tarea at, con CTRL+D

Cosas importantes a tener en cuenta:
a) Los comandos de ejecutan con /bin/sh no con /bin/bash
b) Si la hora de ejecución ya pasó la tarea no se ejecutará.

Sintaxis de at

at hora [fecha]

Ejemplos de uso:

# Tarea que se ejecutará a las 11:00 del dia actual
at 11:00
...

# Tarea que se ejecutará el primero Domingo (Sun) a las 20:00
at 20:00 Sun
...

# Tarea que se ejecutará a las 4:00 el 14/03/2023 
at 04:00 2023-03-14

# Tarea que se ejecutará a las 4:00 el 14/03/2023 
at 4am 22.10.14
...

Se permite usar at indicando un 'incremento' de tiempo:

# Ejecutar tarea dentro de 3 horas
at now + 3 hours

# Ejecutar mañana (incremento especial = + 1 days)
at 15:00 tomorrow 

Ejemplo sencillo de uso de at

Queremos listar los ficheros que hay en la ruta /tmp el 26 de febrero de 2023.
Nota: Pulsar INTRO para finalizar cada línea

at 11:40 2023-02-26
ls -ltr /tmp > "~/prueba_comando_at.txt"
echo 'finalizado ' >>  "~/prueba_comando_at.txt"
CTRL + D

Cuando llegue el día y la hora de ejecución veremos que en la ruta /home/<usuario>  (~/) del usuario que programó la tarea, se habrá creado el fichero 'prueba_comando_at.txt' con el contenido que tenga en ese momento la ruta /tmp

Listar las tareas programadas

Para listar las tareas usaremos el comando atq

atq
9 Sun Feb 26 11:40:00 2023 a luisgulo

El primer número que aparece (en este caso el 9), es el número de tarea.

Como usuario sólo veremos nuestras tareas programadas
Como root veremos todas las tareas programadas, tanto las de root, como las de otros usuarios.

Las tareas se almacenan en el directorio: /var/spool/cron/atjobs

Ver el contenido de una tarea

Para ver el contenido usamos el comando at con una serie de parámetros:

at -c NumeroTarea

at -c 9

#!/bin/sh
# atrun uid=1000 gid=1000
# mail luisgulo 0
umask 22
...
GDM_LANG=es_ES.utf8; export GDM_LANG
HOME=/home/luisgulo; export HOME
LANG=es_ES.UTF-8; export LANG
...
USER=luisgulo; export USER
...
cd /home/luisgulo || {
	 echo 'Execution directory inaccessible' >&2
	 exit 1
}
ls -ltr /tmp > ~/prueba-at.txt
echo 'finalizado ' >> ~/prueba-at.txt

Vemos que se guardan todas las variables de la sesión actual que se tengan definidas y que la ejecución se ejecuta mediante /bin/sh

Eliminar tareas programadas

Una vez que tengamos el listado de tareas y su número (con atq), podemos eliminar las tareas que deseemos con el comando atrm

# Listar tareas actuales
atq
9	Sun Feb 26 11:40:00 2023 a luisgulo

# Borrar la tarea 9
atrm 9

Nota: También se pueden eliminar las tareas si las borramos desde el directorio en que se almacenan /var/spool/cron/atjobs

Resumen de la herramienta at y comandos asociados

Crear Tarea

at hh:mm YYYY-MM-DD
Usar hora y fecha. Si se usa sólo la hora se ejecutará en el dia actual.
Escribir cada comando + INTRO
Finalizar creacion de tarea con CTRL+D

Listar Tareas / Ver contenido de la tarea

atq / at -l
Se puede usar el comando at con el parámetro -l (listar)
●  at -c Num
Ver los comandos que ejecutará la tarea Num

Borrar Tareas

atrm Num / at -r Num
Se puede usar también at con el parámetro -r (remove/borrar)

Ruta de las Tareas

Todas las tareas se almacenan en el directorio: /var/spool/cron/atjobs

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux