Cómo usar at y batch en Linux para programar comandos

Si deseas programar un trabajo (job) de Linux que sucederá solo una vez, cron es excesivo. ¡La familia de comandos at es lo que necesitas! Y si deseas ejecutar procesos solo cuando tu sistema tiene recursos libres, puedes usar batch.

Cómo programar trabajos en Linux

El demonio cron mantiene una lista de jobs que se ejecutan en momentos específicos. Estas tareas y programas se ejecutan en segundo plano a las horas programadas.

Esto te ofrece una gran flexibilidad para programar tareas que deben repetirse. Ya sea que necesites ejecutar una tarea una vez cada hora, a una hora específica cada día, o una vez al mes o al año, puedes configurarla con cron.

Sin embargo, esto no ayuda si deseas programar una tarea para que se ejecute solo una vez. Claro, puedes configurar cron, pero luego debes recordar volver y eliminar la entrada crontab después de que se ejecute la tarea, lo cual es inconveniente.

Con Linux, si estás luchando con un problema, es casi una garantía de que alguien más también ha luchado con él. Afortunadamente, debido a que los sistemas operativos tipo Unix han existido durante tanto tiempo, también existe una excelente posibilidad de que alguien haya creado una solución a tu problema.

Para el problema descrito anteriormente, tienes solución, y se llama at.

Instalar el comando at

Tuvimos que instalar aten Ubuntu 18.04 y Manjaro 18.1.0 (ya estaba instalado en Fedora 31).

Para instalar at en Ubuntu, usa este comando:

Una vez completada la instalación, puedes iniciar el demonio at con este comando:

En Manjaro, instala at con este comando:

Una vez completada la instalación, escribe este comando para iniciar el demonio at:

En cualquier distribución, puedes escribir este comando para asegurarte de que el demonio atd se está ejecutando:

Cómo usar el comando at de forma interactiva

Para usar at, debes asignarle una fecha y hora de ejecución. Hay una gran flexibilidad en la forma en que puedes escribirlos, que cubriremos más adelante en este artículo.

Sin embargo, aunque vamos a usar at de forma interactiva, debes proporcionar la fecha y la hora por adelantado. Si no incluyes nada en la línea de comandos, o escribes algo que no es una fecha y hora, at responde con “Hora ilegible”, como se muestra a continuación:

Las fechas y horas pueden ser explícitas o relativas. Por ejemplo, supongamos que deseas que se ejecute un comando dentro de un minuto. at sabe lo que significa “ahora”, por lo que puedes usar now y agregarle un minuto, así:

at imprime un mensaje y una solicitud at, y espera a que escribas los comandos que deseas programar. Primero, sin embargo, considera el mensaje, como se muestra a continuación:

Le dices que at inicie una instancia de la shell sh y ejecutará los comandos dentro de esta. Tus comandos no se ejecutarán en la shell Bash, que es compatible con la shell sh pero tiene un conjunto de características más completo.

Si tus comandos o scripts intentan usar una función o facilidad que Bash proporciona, pero sh no lo hace, fallarán.

Es fácil probar si tus comandos o scripts se ejecutarán en sh. Usa el comando sh para iniciar una shell sh:

La terminal cambia a un signo de dólar ($), y ahora puedes ejecutar tus comandos y verificar que funcionen correctamente.

Para volver a la shell Bash, escribe el comando exit:

Salida

No verás ningún mensaje de salida o error estándar de los comandos. Esto se debe a que la shell sh se inicia como una tarea en segundo plano y se ejecuta sin ningún tipo de interfaz de pantalla.

Cualquier salida de los comandos, buena o mala, se te envía por correo electrónico. Se envía a través del sistema de correo interno a quien ejecuta el comando at. Esto significa que debes ajustar y configurar ese sistema de correo electrónico interno.

Muchos (la mayoría) de los sistemas Linux no tienen un sistema de correo electrónico interno, ya que rara vez se necesita uno. Los que lo hacen suelen utilizar un sistema como sendmail o postfix. Si tu sistema no tiene un sistema de correo electrónico interno, puedes hacer que los scripts escriban en los archivos o redirijan la salida a los archivos para agregar registros.

Si el comando no genera ningún resultado estándar o mensaje de error, de todos modos, no recibirá un correo electrónico. Muchos comandos de Linux indican éxito a través del silencio, por lo que, en la mayoría de los casos, no recibirás un correo electrónico.

Ahora es el momento de escribir un comando at. Para este ejemplo, vamos a utilizar un pequeño archivo de script llamado sweep.sh que elimina los archivos *.bak, *.tmp*.o. Escribe la ruta al comando, como se muestra a continuación, y luego presiona Enter.

Te aparecerá otro indicador y puedes agregar tantos comandos como desees. Por lo general, es más conveniente tener tus comandos en un solo script y simplemente llamar a ese script desde dentro de at.

Funcionamiento

Presiona Ctrl + D para indicar que at ha terminado de agregar comandos. at muestra <EOT>, que significa el final de la transmisión. Se te indica el número de job y cuándo está programado para ejecutarse, como se muestra a continuación:

Después de que se ejecute, escribe lo siguiente para verificar tu correo interno:

Si no hay correo, debes asumir el éxito de la acción. Por supuesto, en este caso, se puede comprobar y ver si los archivos *.bak, *.tmp*.o se han eliminado para confirmar que el comando funcionó.

Escribe lo siguiente para ejecutar todo de nuevo:

Después de un minuto, escribe lo siguiente para volver a verificar tu correo:

¡Hey, tenemos un correo! Para leer el mensaje número uno, presiona 1 y luego presiona Enter.

Recibimos un correo electrónico de at porque los comandos en el script generaron mensajes de error. En este ejemplo, no había archivos para eliminar porque cuando ejecutamos el script anteriormente, los eliminó.

Presiona D + Enter para eliminar el correo electrónico y Q + Enter para salir del programa de correo.

Formatos de fecha y hora

Tienes mucha flexibilidad cuando se trata de los formatos de tiempo que puede usar at. Aquí están algunos ejemplos:

  • Ejecutar a las 11:00 am:
    • at 11:00 AM
  • Correr a las 11:00 am mañana:
    • at 11:00 AM tomorrow
  • Ejecutar a las 11:00 am de este día la próxima semana:
    • at 11:00 AM next week
  • Ejecutar en este momento, en este día, la próxima semana:
    • at next week
  • Correr a las 11:00 am del próximo viernes:
  • at 11:00 AM next fri
  • Correr a esta hora el próximo viernes:
    • at next fri
  • Ejecutar a las 11:00 am en esta fecha, el próximo mes:
    • at 11:00 AM next month
  • Correr a las 11:00 am en una fecha específica:
    • at 11:00 AM 15/03/2020
  • Ejecutar dentro 30 minutos a partir de ahora:
    • at now + 30 minutes
  • Ejecutar en dos horas a partir de ahora:
    • at now + 2 hours
  • Correr a esta hora mañana:
    • At tomorrow
  • Correr a esta hora el jueves:
    • at thursday
  • Ejecutar a las 12:00 a.m.
    • at midnightla medianoche
  • Ejecutar a las 12:00 pm:
    •  at noon
  • Si eres británico, incluso puedes programar un comando para que se ejecute a la hora del té (4 pm):
    • at teatime

Observando la cola de trabajo

Puede escribir el comando atq para ver la cola de trabajos programados, como se muestra a continuación.

Para cada comando en la colaatq muestra la siguiente información:

  • ID Job
  • Cita programada
  • Hora programada
  • Hacer cola en el trabajo. Las colas están etiquetadas como “a”, “b”, etc. Las tareas normales que programa at son la cola “a”, mientras que las tareas que programa batch (cubiertas más adelante en este artículo) entran en la cola “b”.
  • La persona que programó el trabajo.

Usando en la línea de comandos

No tienes que usar at de forma interactiva; También puedes usarlo en el comando. Esto facilita el uso de scripts internos.

Puedes canalizar comandos en at, así:

El trabajo es aceptado y programado por at, y el número de trabajo y la fecha de ejecución se informan como antes.

Usar at con archivos de comandos

También puedes almacenar una secuencia de comandos en un archivo y luego pasarla a at. Este puede ser un archivo de comandos de texto sin formato; no tiene que ser un script ejecutable.

Puedes usar la opción –f (archivo) de la siguiente manera para pasar un nombre de archivo a at:

Puedes lograr el mismo resultado si rediriges el archivo a at:

Eliminar trabajos programados de la cola

Para eliminar un trabajo programado de la cola, puedes usar el comando atrm. Si desea ver la cola primero para encontrar el número del trabajo que deseas eliminar, puedes usar atq. Luego, usa ese número de trabajo con atrm, como se muestra a continuación:

Cómo ver una vista detallada de trabajos

Como mencionamos anteriormente, puedes programar trabajos en el futuro. A veces, puedes olvidar lo que va a hacer un trabajo. El comando atq te muestra los trabajos en la cola, pero no lo que van a hacer. Si deseas ver una vista detallada de un trabajo, puedes usar la opción –c (cat).

Primero, usaremos atq para encontrar el número de trabajo:

Ahora, usaremos el trabajo número 13 con la opción –c:

Aquí hay un desglose de la información que recibimos sobre el trabajo:

  • Primera línea: esto nos dice que los comandos se ejecutarán bajo la shell sh.
  • Segunda línea:  vemos que los comandos se ejecutarán con un ID de usuario y de grupo de 1000. Estos son los valores para la persona que ejecutó el comando at.
  • Tercera línea:  la persona que recibe los correos electrónicos que at envía.
  • Cuarta línea:  la máscara de usuario es 22. Esta es la máscara utilizada para establecer los permisos predeterminados para cualquier archivo creado en esta sesión sh. La máscara se resta de 666, lo que nos da 644 (el equivalente octal de rw-r–r–).
  • Datos restantes:  la mayoría son variables de entorno.
  • Resultados de una prueba.  Una prueba verifica para asegurarse de que se pueda acceder al directorio de ejecución. Si no puede, se genera un error y se abandona la ejecución del trabajo.
  • Los comandos a ejecutar.  Estos se enumeran y se muestra el contenido de los scripts programados. Ten en cuenta que, aunque el script en nuestro ejemplo anterior fue escrito para ejecutarse bajo Bash, todavía se ejecutará en una shell sh.

El comando batch

El comando batch funciona de manera similar al comando at, pero con tres diferencias significativas:

  1. Solo puedes usar el comando batch de forma interactiva.
  2. En lugar de programar trabajos para ejecutarlos en un momento específico, los agrega a la cola y el comando batch los ejecuta cuando el promedio de carga del sistema es inferior a 1.5.
  3. Debido a lo anterior, nunca especifiques una fecha y hora con el comando batch.

Cuando usas el comando batch, lo llamas por su nombre sin parámetros de la línea de comandos de la siguiente manera:

A continuación, debes agregar tareas tal como lo harías con el comando at.

Controlando el acceso al comando at

Los archivos at.allowat.deny controlan quién puede usar la familia de comandos at. Estos se encuentran dentro del directorio /etc. De forma predeterminada, solo existe el archivo at.deny  y se crea cuando at se instala.

Así es como funcionan estos:

  • at.deny: Enumera las aplicaciones y entidades que no pueden usar at para programar trabajos.
  • at.allow: Listas que puede usar  at para programar trabajos. Si el archivo at.allow no existe, at solo usa el archivo at.deny.

Por defecto, cualquiera puede usar at. Si deseas restringir quién puede usarlo, debes usar el archivo at.allow para enumerar los que pueden hacerlo. Esto es más fácil que agregar a todos los que no pueden usar at en el archivo at.deny.

Así es como se ve el archivo at.deny:

El archivo enumera los componentes del sistema operativo que no pueden usar at. Muchos de estos no pueden hacerlo por razones de seguridad, por lo que no deseas eliminar ninguno del archivo.

Ahora, editaremos el archivo at.allow. Vamos a agregar davemary, pero a nadie más se le permitirá usar at.

Primero, escribimos lo siguiente:

En el editor, agregamos los dos nombres, como se muestra a continuación, y luego guardamos el archivo.

Si alguien más trata de usar at, se le dirá que no tiene permiso. Por ejemplo, supongamos que un usuario llamado eric escribe lo siguiente:

Sería rechazado, como se muestra a continuación.

De nuevo, eric no está en el archivo at.deny. Tan pronto como pongas a alguien en el archivo at.allow , a cualquiera y a todos los demás se les niega el permiso de uso de at.

Genial para excepciones

Como se puede ver, tanto atbatch son ideales para las tareas que sólo tienen que ejecutarse una vez. De nuevo, como una revisión rápida:

  • Cuando necesites hacer algo que no sea un proceso regular, prográmalo con at.
  • Si deseas ejecutar una tarea solo cuando la carga del sistema es lo suficientemente baja, usa batch.