Aplazar una tarea hasta un momento concreto en Ubuntu 14.04 LTS

Publicado por P. Ruiz en

Cuando administramos un sistema, es fundamental poder aplazar tareas para ejecutarlas automáticamente cuando pase un tiempo. Esto nos permite ejecutar un script de mantenimiento, realizar una copia de seguridad de una base de datos o incluso apagar el equipo en un momento del futuro de nuestra elección.

Es importante aclarar que el objetivo no es crear tareas repetitivas que se ejecuten en periodos concretos, como hemos aprendido a realizar en otros artículos  con cron o anacron. En este caso, el objetivo es ejecutar un comando, una vez, como si lo fuésemos a hacer en este momento, pero retrasando su ejecución a un momento determinado.

Si lo que pretendes es realizar tareas repetitivas, puedes consultar los siguientes artículos publicados también en SomeBooks.es::

Cuando ejecutamos el comando at se pone en funcionamiento el servicio atd que controlará el momento exacto en el que se ejecutará el comando que le hayamos indicado. El comando at guarda los valores de las variables de entorno y el directorio actual y los utilizará para ejecutar la tarea, de forma que no le afecten los cambios que se produzcan después de programarla.

Por ejemplo, si quiero que se ejecute el editor de textos, de forma automática, a las 10:17, sólo tendría que escribir en la consola una orden como esta:

at 10:17

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, como en este ejemplo, 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.

Para comprobar su funcionamiento, haremos que, a la hora indicada, se ejecute el editor de textos y después la calculadora. Cuando hayamos terminado de escribir, pulsamos la combinación de teclas Ctrl + D. En la pantalla aparecerá la marca <EOT>.

Como vamos a ejecutar programas que utilizan la interfaz gráfica, usamos el comando export DISPLAY=:0 para identificar la pantalla donde deben aparecer.

El aspecto de la terminal será parecido al de la imagen.

Cuando llegue el momento indicado, se ejecutará el editor de textos.

… Y hasta que no lo cerremos, no se abrirá la calculadora.

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

En otro orden de cosas, como ya ocurría con el servicio cron, el administrador dispone de los archivos at.allow y at.deny para determinar qué usuarios pueden programar tareas utilizando at.

Una forma sencilla de consultar los trabajos que tiene pendientes el servicio atd es utilizando el comando atq:

Se muestra el número de trabajo, la fecha y la hora, la cola y el nombre del usuario al que pertenecen.

El comando atq muestra los trabajos pendientes del usuario, salvo que lo ejecutemos como superusuario. En este caso, se muestran los trabajos de todos los usuarios.

Si lo prefieres, en lugar de atq puedes utilizar at con el argumento -l:

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 3

Vemos que se ha creado un script más complejo al que, al final, se le ha añadido el comando que queremos ejecutar.

También podemos eliminar los trabajos pendientes con el comando atrm. Lógicamente, hay que indicar el número de trabajo que queremos eliminar:

atrm 2

Aquí vemos cómo se ha eliminado el trabajo 2

En lugar de atrm, también puedes utilizar el comando at con el argumento -d.

Por cierto, como ocurría con los trabajos pendientes de cron, los de at se guardan en la carpeta /var/spool/at.

Los servicios cron, anacron y atd pueden iniciarse, detenerse, reiniciarse, etc., como cualquier otro servicio del sistema. Si es necesario, puedes consultar los artículos publicados en SomeBooks.es para administrarlos desde la línea de comandos:

Y si prefieres trabajar en la interfaz gráfica:

Y esto es todo por el momento. Espero que te haya resultado útil.