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:
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!