Usar at para ejecutar una tarea programada por única vez

Algunas veces desearemos programar una tarea para su ejecución por una única vez. Si bien en teoría podríamos utilizar una entrada de crontab para cumplir con este objetivo, en Linux disponemos de una utilidad llamada at que nos permite hacerlo de manera mucho más fácil y sin tener que borrar la entrada posteriormente. Por ese motivo, en este post mostraremos cómo usar at para correr un programa o ejecutar un comando agendado una sola vez.

Cómo usar at

Para usar at es necesario instalarlo para luego iniciar el servicio y habilitarlo para que arranque en los próximos reinicios. Para instalar at, utilizaremos los siguientes comandos (asumimos que estamos utilizando una distribución con systemd):

yum install at # CentOS
aptitude install at # Debian y similares
systemctl start atd # Iniciar
systemctl enable atd # Habilitar

Una vez que el servicio atd está corriendo, podemos agendar cualquier tarea de la siguiente manera:

echo "escribir el comando aquí entre comillas" | at [opción para indicar el momento deseado]

donde el tiempo (fecha y hora) deseado de ejecución debe ser compatible con el estándar POSIX. A continuación algunos ejemplos:

Hora:

  • 9pm
  • 20:45
  • now (ahora)
  • noon (12pm)
  • midnight (00:00)

Fecha:

  • today (hoy)
  • tomorrow (mañana)
  • Sep 10 (10 de septiembre)
  • Jan 5 (5 de enero)

Podemos también crear combinaciones de fecha y hora, como por ejemplo:

  • 10:45pm Jan 10 representa las 22:45 hs del día 10 de enero
  • 8:23am May 11 indica las 8:23 hs del día 11 de mayo

Incremento:

  • +minutes
  • +hours
  • +days
  • +weeks
  • +months
  • +years

(Para el incremento también se aceptan las formas singulares minute, hour, day, week, month, y year). El incremento se utiliza para «sumar» una cierta medida de tiempo al momento indicado para la ejecución de la tarea.

Ejemplos

Veamos mediante unos ejemplos cómo llevamos todo esto a la práctica.

EJEMPLO 1 – Para crear un tarball llamado scripts.tar.gz (donde guardaremos todos los archivos .sh ubicados dentro del directorio actual) dentro de 2 minutos, haremos lo siguiente:

echo "tar czf scripts.tar.gz *.sh" | at now +2 minutes

Veamos el resultado en la Fig. 1, donde podemos observar que la fecha asociada con el archivo corresponde con la hora «anunciada» por at para la ejecución del comando anterior:

Correr un comando dentro de dos minutos mediante at
Figura 1 – Correr un comando dentro de dos minutos mediante at

EJEMPLO 2 – Si queremos ejecutar updatedb el 11 de septiembre a las 7:15am, usaremos el siguiente comando:

echo "updatedb" | at 7:15am Sep 11

Como vemos, agendar comandos para que se ejecuten en el futuro por única vez es tarea fácil con at. ¡Nos leemos en breve!