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

Una ventana de terminal en un sistema Linux.
Fatmawati Achmad Zaenuri / Shutterstock

Si desea programar un trabajo de Linux que sucederá solo una vez, crones excesivo. ¡La atfamilia de comandos es lo que necesitas! Y si desea ejecutar procesos solo cuando su sistema tenga recursos libres, puede usar batch.

Cómo programar trabajos de Linux

El crondaemon mantiene una lista de trabajos que ejecuta en momentos específicos . Estas tareas y programas se ejecutan en segundo plano a la hora programada. Esto le ofrece una gran flexibilidad para programar tareas que deben repetirse. Ya sea que necesite ejecutar una tarea una vez cada hora, a una hora específica cada día, o una vez al mes o al año, puede configurarla en cron.

Sin embargo, esto no ayuda si desea programar una tarea para que se ejecute solo una vez. Claro, puede  configurarlocron , pero luego debe recordar regresar y eliminar la entrada crontab  después de que se ejecute la tarea, lo cual es inconveniente.

Con Linux, si está 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 su problema.

Para el problema descrito anteriormente, lo han hecho y se llama at.

Instalación del comando at

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

Para instalar aten Ubuntu, use este comando:

sudo apt-get install en

El comando "sudo apt-get install at" en una ventana de terminal.

Una vez completada la instalación, puede iniciar el atdemonio con este comando:

sudo systemctl enable --ahora atd.service

El comando "sudo systemctl enable --now atd.service" en una ventana de terminal.

En Manjaro, se instala atcon este comando:

sudo pacman -Sy en

El comando "sudo pacman -Sy at" en una ventana de terminal.

Una vez completada la instalación, escriba este comando para iniciar el atdemonio:

sudo systemctl enable --ahora atd.service

El comando "sudo systemctl enable --now atd.service" en una ventana de terminal.

En cualquier distribución, puede escribir este comando para asegurarse de que el atddemonio se esté ejecutando:

ps -e | grep atd

El comando "ps -e | grep atd" en una ventana de terminal.

Cómo utilizar el comando at de forma interactiva

Para usarlo at, debe asignarle una fecha y hora para que se ejecute. Existe una gran flexibilidad en la forma en que puede escribirlos, que cubriremos más adelante en este artículo.

Sin embargo, aunque lo usaremos de forma  atinteractiva, debe proporcionar la fecha y la hora por adelantado. Si no incluye nada en la línea de comando, o escribe algo que no es una fecha y hora, at responde con «Hora ilegible», como se muestra a continuación:

a
en banana

Un uso incorrecto del comando "at" en una ventana de terminal.

Las fechas y horas pueden ser explícitas o relativas. Por ejemplo, digamos que desea que un comando se ejecute dentro de un minuto. atsabe lo que significa «ahora», por lo que puede usarlo nowy agregarle un minuto, así:

ahora + 1 minuto

El comando "ahora + 1 minuto" en una ventana de terminal.

atimprime un mensaje y una atindicación, y espera a que escriba los comandos que desea programar. Primero, sin embargo, considere el mensaje, como se muestra a continuación:

El símbolo del sistema "at" en una ventana de terminal.

Le dice que  at lanza una instancia del shshell y  ejecutará los comandos dentro de ella . Sus comandos no se ejecutarán en el shell Bash, que es compatible con el shshell pero tiene un conjunto de funciones más rico.

Relacionado:  Cómo exportar e importar sus sistemas Linux en Windows 10

Si sus comandos o scripts intentan usar una función o instalación que proporciona Bash, pero shno lo hace, fallarán.

Es fácil probar si sus comandos o scripts se ejecutarán sh. Utilice el shcomando para iniciar un shshell:

sh

El shell "sh" en una ventana de terminal.

El símbolo del sistema cambia a un signo de dólar ( $) y ahora puede ejecutar sus comandos y verificar que funcionan correctamente.

Para volver al shell de Bash, escriba el exitcomando:

salida

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

Cualquier resultado de los comandos, bueno o malo, se le envía por correo electrónico. Se envía a través del sistema de correo interno a quien ejecuta el atcomando. Esto significa que debe instalar 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. Aquellos que lo hacen suelen utilizar un sistema como  sendmail o postfix . Si su sistema no tiene un sistema de correo electrónico interno, puede hacer que los scripts se escriban en los archivos o redirigir la salida a los archivos para agregar registros.

Si el comando no genera ningún mensaje de error o salida estándar , no recibirá un correo electrónico de todos modos. Muchos comandos de Linux indican el éxito a través del silencio, por lo que en la mayoría de los casos, no recibirá 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.shque elimina los  *.bak, *.tmpy *.oarchivos. Escriba la ruta al comando, como se muestra a continuación, y luego presione Entrar.

El comando "~ / sweep.sh" en una ventana de terminal.

Aparece otro símbolo del sistema y puede agregar tantos comandos como desee. Por lo general, es más conveniente tener sus comandos en un solo script y simplemente llamar a ese script desde dentro at.

Presione Ctrl + D para indicar at que ha terminado de agregar comandos. atmuestra <EOT>, que significa  fin de transmisión . Se le indica el número de trabajo y cuándo está programado su ejecución, como se muestra a continuación:

Confirmación del "trabajo 4" programado para ejecutarse el "miércoles 18 de diciembre 08:37:00 2019" en una ventana de terminal.

Después de que se ejecute el trabajo, escriba lo siguiente para verificar su correo interno:

correo

El comando "correo" en una ventana de terminal.

Si no hay correo, debe asumir el éxito. Por supuesto, en este caso, se puede comprobar y ver si el  *.bak, *.tmpy *.ose han eliminado archivos para confirmar el comando funcionó.

Escriba lo siguiente para ejecutar todo de nuevo:

ahora + 1 minuto

El comando "ahora + 1 minuto" en una ventana de terminal.

Después de un minuto, escriba lo siguiente para volver a revisar su correo:

correo

El comando "correo" que indica "1 mensaje 1 no leído" en una ventana de terminal.

¡Oye, tenemos correo! Para leer el mensaje número uno, presione 1 y luego presione Enter.

Un correo electrónico interno en una ventana de terminal.

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

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

Formatos de fecha y hora

Tiene mucha flexibilidad en lo que respecta a los formatos de hora que puede utilizar at. Aquí están algunos ejemplos:

  • Ejecutar a las 11:00 am:
    • a las 11:00 AM
  • Ejecutar mañana a las 11:00 am:
    • mañana a las 11:00
  • Ejecutar a las 11:00 a.m. de este día la próxima semana:
    • a las 11:00 AM la semana que viene
  • Ejecutar a esta hora, en este día, la próxima semana:
    • la semana que viene
  • Corre a las 11:00 am el próximo viernes:
    • a las 11:00 AM el próximo viernes
  • Ejecutar a esta hora el próximo viernes:
    • el próximo viernes
  • Ejecutar a las 11:00 am en esta fecha, el próximo mes:
    • a las 11:00 a.m. del próximo mes
  • Ejecutar a las 11:00 am en una fecha específica:
    • a las 11:00 AM 15/03/2020
  • Ejecutar dentro de 30 minutos:
    • ahora + 30 minutos
  • Ejecutar dentro de dos horas:
    • ahora + 2 horas
  • Ejecutar mañana a esta hora:
    • mañana
  • Ejecutar a esta hora el jueves:
    • el jueves
  • Ejecutar a las 12:00 am:
    • a la medianoche
  • Ejecutar a las 12:00 pm:
    • al mediodía
  • Si eres británico, incluso puedes programar un comando para que se ejecute a la hora del té (4 pm):
    • a la hora del té

Mirando la cola de trabajos

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

Relacionado:  Cómo arreglar Windows y Linux que muestran diferentes momentos al arrancar dual

Salida del comando "atq" que muestra 5 trabajos en una ventana de terminal.

Para cada comando en la cola, atqmuestra la siguiente información:

  • Identificación del trabajo
  • Cita agendada
  • Hora programada
  • Cola en la que está el trabajo . Las colas están etiquetadas como «a», «b», etc. Las tareas normales con las que programa atvan a la cola «a», mientras que las tareas con las que programa batch (tratadas más adelante en este artículo) van a la cola «b»
  • La persona que programó el trabajo.

Usando at en la línea de comando

No tiene que usarlo de forma atinteractiva; también puede usarlo en el comando. Esto facilita el uso de scripts internos.

Puede canalizar comandos at, así:

echo "sh ~ / sweep.sh" | en 08:45 AM

Un comando "echo" sh ~ / sweep.sh "| at 08:45 AM" en una ventana de terminal.

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 puede almacenar una secuencia de comandos en un archivo y luego pasarlo a at. Puede ser un archivo de comandos de texto sin formato, no tiene que ser un script ejecutable.

Puede utilizar la -fopción (archivo) de la siguiente manera para pasar un nombre de archivo a at:

ahora + 5 minutos -f clean.txt

Un comando "ahora + 5 minutos -f clean.txt" en una ventana de terminal.

Puede lograr el mismo resultado si redirige el archivo a at:

ahora + 5 minutos <clean.txt

Un comando "ahora + 5 minutos <clean.txt" en una ventana de terminal.

Eliminación de trabajos programados de la cola

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

atq
atrm 11
atq

Eliminando el trabajo 11 de la cola arroba en una ventana de terminal.

Cómo ver una vista detallada de los trabajos

Como mencionamos anteriormente, puede programar trabajos en el futuro. A veces, es posible que olvide lo que va a hacer un trabajo. El atqcomando le muestra los trabajos en la cola, pero no lo que van a hacer. Si desea ver una vista detallada de un trabajo, puede utilizar la -copción (cat).

Primero, usaremos atqpara encontrar el número de trabajo:

atq

Salida del comando "atq" en una ventana de terminal.

Ahora, usaremos el trabajo número 13 con la -copción:

en -c 13

El comando "at -c 13" y la salida en una ventana de terminal.

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

  • Primera línea: Esto nos dice que los comandos se ejecutarán bajo el shshell.
  • 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 atcomando.
  • Tercera línea:  la persona que recibe los correos electrónicos  atenviados.
  • Cuarta línea:  la máscara de usuario es 22. Esta es la máscara que se utiliza para establecer los permisos predeterminados para cualquier archivo creado en esta shsesión. 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.
Relacionado:  Cómo usar el comando timeout en Linux

Salida del comando "-c 13" en una ventana de terminal.

  • 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. Tenga en cuenta que, aunque el script de nuestro ejemplo anterior se escribió para ejecutarse en Bash, aún se ejecutará en un shshell.

El comando por lotes

El batchcomando opera de manera similar al atcomando, pero con tres diferencias significativas:

  1. Solo puede utilizar el batchcomando de forma interactiva.
  2. En lugar de programar trabajos para que se ejecuten en un momento específico, los agrega a la cola y el batchcomando los ejecuta cuando la carga promedio del sistema  es inferior a 1.5.
  3. Debido a lo anterior, nunca especifica una fecha y hora con el batchcomando.

Cuando usa el batchcomando, lo llama por su nombre sin parámetros de línea de comando como este:

lote

El comando "lote" en una ventana de terminal.

A continuación, agregue tareas como lo haría con el atcomando.

Controlar el acceso al comando at

Los archivos at.allowy at.denycontrolan quién puede usar la atfamilia de comandos. Estos se encuentran dentro del /etcdirectorio. De forma predeterminada, solo at.denyexiste el archivo y se crea cuando atse instala.

Así es como funcionan estos:

  • at.deny: Enumera las aplicaciones y entidades que no se pueden usar atpara programar trabajos.
  • at.allow: Enumera quién puede utilizar  atpara programar trabajos. Si el at.allowarchivo no existe, atsolo usa el at.denyarchivo.

De forma predeterminada, cualquiera puede usar at. Si desea restringir quién puede usarlo, use el at.allowarchivo para enumerar los que pueden. Esto es más fácil que agregar atal at.denyarchivo a todos los que no pueden usar .

Así at.denyes como se ve el archivo:

sudo menos /etc/at.deny

El comando "sudo less /etc/at.deny" en una ventana de terminal.

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

El contenido del archivo at.deny en una ventana de terminal.

Ahora, editaremos el at.allowarchivo. Vamos a agregar  davey mary, pero nadie más podrá usar at.

Primero, escribimos lo siguiente:

sudo gedit /etc/at.allow

El comando "sudo gedit /etc/at.allow" en una ventana de terminal.

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

"Dave" y "Mary" se agregaron a gedit.

Si alguien más intenta usar at, se le dirá que no tiene permiso. Por ejemplo, digamos que un usuario con nombre ericescribe lo siguiente:

a

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

A "eric" se le niega el permiso para usar "en" en una ventana de terminal.

Nuevamente, ericno está en el at.denyarchivo. Tan pronto como ingrese a alguien en el at.allowarchivo, a todos se les niega el permiso de uso at.

Ideal para ocasiones especiales

Como puede ver, ambos  atbatchson ideales para tareas que solo necesita ejecutar una vez. Nuevamente, como una revisión rápida:

  • Cuando necesite hacer algo que no sea un proceso regular, prográmelo con at.
  • Si desea ejecutar una tarea solo cuando la carga del sistema sea lo suficientemente baja, utilice batch.