Programar una tarea para un momento concreto en Ubuntu 24.04 LTS
No hace mucho, aprendimos a Programar una tarea repetitiva en Ubuntu Server 24.04 LTS. Sin embargo, en ocasiones, en lugar de realizar tareas de forma periódica, lo que necesitamos es ejecutar algo, sólo una vez, pero en un momento particular del futuro. Para cumplir con ese objetivo, disponemos del comando at.
A pesar de que se trata de un comando muy habitual, en Ubuntu no se encuentra instalado de forma predeterminada, pero, como está almacenado en sus repositorios oficiales, para obtenerlo, sólo tendremos que escribir una orden como esta:
sudo apt-get install at
El artículo de hoy lo hemos desarrollado sobre Ubuntu Server pero, para ponerlo en práctica sobre la versión de escritorio, solo tienes que abrir una ventana de terminal. Por ejemplo, usando la combinación de teclas Alt + Control + T.
A partir de aquí, cada vez que ejecutamos el comando at se pondrá en funcionamiento el servicio atd que controlará el momento exacto en el que se ejecute el comando que le hayamos indicado.
El comando at guarda los valores de las variables de entorno y el directorio actual para utilizarlos en el momento de ejecutar la tarea. Así, no le afectarán los cambios que se produzcan después de programarla.
Por ejemplo, si quiero que se apague el ordenador de forma automática cuando lleguen las 21:30, comenzaré por escribir en la consola una orden como esta:
sudo at 21:30
Ten en cuenta que estamos utilizando el comando con privilegios de root porque apagar el equipo es una tarea administrativa.
Veremos que aparece un prompt específico de at donde escribimos los comandos que queramos que se ejecuten.
Cuando escribamos el nombre de más de un comando o programa, debemos saber que no se iniciará la ejecución del segundo mientras se esté ejecutando el primero (aunque haya pasado el momento en el que debería iniciarse). La intención de este comportamiento es que podamos programar tareas que estén formadas por varias subtareas que deban ejecutarse por orden. Si necesitamos varias tareas que puedan iniciar su ejecución de forma simultánea sólo tendremos que ejecutar at varias veces.
Si estás utilizando una versión de escritorio de Ubuntu, y pretendes ejecutar programas que utilicen la interfaz gráfica, debes comenzar por escribir el comando export DISPLAY=:0 para identificar la pantalla donde deben aparecer.
Cuando hayamos terminado de escribir, pulsamos la combinación de teclas Ctrl + D. En la pantalla aparecerá la marca <EOT>.
Cuando llegue la hora indicada, comprobarás que el ordenador comienza a apagarse exactamente igual que si lo estuviésemos apagando manualmente.
La expresión del momento en el que se producirá la ejecución atiende a la forma at [hora] [fecha] y se puede expresar de las siguientes formas:
-
Hora: Indica la hora en la que se llevará a cabo la acción y se puede expresar en cualquiera de los formatos siguientes: HH:MM, HHMM, HH.MM, HH,MM, Hpm, Ham. Donde H ó HH será un valor entero que representa las horas, MM un valor entero que representa los minutos y am ó pm antes del medio día o después del medio día (12:00). Además, se pueden utilizar las palabras midnight que se corresponde con las 00:00, noon que representa las 12:00, now que sustituye a la hora actual y teatime que corresponde a las 16:00
-
Fecha: Representa la fecha en la que se ejecutará la acción. Se puede escribir en inglés, utilizando el formato mes día año (por ejemplo, june 17 2013). Incluso podemos suprimir el año cuando nos referimos al actual. También podemos utilizar diferentes formatos numéricos: DD.MM.AA, MMDDAA, MM/DD/AA, AA-MM-DD. Donde DD será un valor entero que representa el día, MM un valor entero que representa el mes y AA otro entero que representa el año. Además, se pueden utilizar las palabras today, que representa la fecha de hoy, tomorrow que hace referencia a la fecha de mañana y el nombre de los días de la semana (en inglés), que hace referencia a la próxima fecha cuyo día de la semana coincida con el indicado.
-
Otra forma de expresar un momento es con la palabra now seguida de un número y una unidad de tiempo. Por ejemplo, si queremos ejecutar una tarea mañana podríamos escribir now + 1 day. Este formato acepta las siguientes unidades de tiempo: min (minutos), minute (minutos), hour (horas), day (días), week (semanas), month (meses) y year (años).
Aquí tienes algunos ejemplos:
at 2pm june 17 at 1013 31.05.14 at teatime tomorrow at 9:15 today + 5 day at now + 1 hour at 08,25 sunday
Una forma sencilla de consultar los trabajos que tiene pendientes el servicio atd es utilizando el comando atq:
sudo atq
Se muestra el número de trabajo, la fecha y la hora, la cola y el nombre del usuario al que pertenecen.
Ten en cuenta que, cuando no utilizamos el comando atq con privilegios administrativos, mostrará los trabajos pendientes del usuario actual.
Observa que, a la izquierda, aparece un número que identifica al trabajo. Este número se asignará, de forma secuencial, a partir de 1.
Por lo tanto, de nuestra imagen podemos deducir que, antes del trabajo actual, han existido otros tres… Pero ya han desaparecido.
Como puedes suponer, un trabajo desaparece por dos motivos:
-
Su plazo ha vencido y se ha ejecutado el comando o comandos que tenía asociados
-
Lo hemos eliminado antes de que llegue su plazo, porque hemos cambiado de opinión y no queremos ejecutarlo. Algo que aprenderemos a hacer más abajo.
Si lo prefieres, en lugar de atq puedes utilizar at con el argumento -l:
sudo at -l
Si lo que queremos es comprobar exactamente qué es lo que se va a ejecutar, podemos utilizar el argumento -c, seguido del número de trabajo a examinar, aunque no es objetivo de esta documentación explicar en detalle su contenido:
at -c 1
Vemos que se ha creado un script más complejo al que, al final, se le ha añadido el comando que queremos ejecutar.
Como hemos mencionado más arriba, también podemos eliminar los trabajos pendientes con el comando atrm. Lógicamente, hay que indicar el número de trabajo que queremos eliminar:
sudo atrm 1
Para este ejemplo, hemos creado una nueva tarea (que se identifica con el número 2). Así, podemos consultar el estado de las tareas, antes y después de eliminar la tarea 1.
En lugar de atrm, también puedes utilizar el comando at con el argumento -d.
Con esto, hemos aprendido lo básico para aplazar la ejecución de cualquier comando hasta el momento que más nos convenga. Espero que te resulte útil.