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

Si desea programar un trabajo de Linux que ocurrirá solo una vez, cron es excesivo. ¡La familia de comandos at es lo que necesitas! Y si desea ejecutar procesos solo cuando su sistema tiene recursos libres, puede usar lotes.

Cómo programar trabajos de Linux

El demonio cron 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 configurarlo en cron, pero luego debe recordar regresar y eliminar el entrada crontab después de que se ejecuta 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 similares a 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 al.

Instalación del comando at

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

Para instalar en Ubuntu, use este comando:

sudo apt-get install at

los

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

sudo systemctl enable --now atd.service

los

En Manjaro, se instala en con este comando:

sudo pacman -Sy at

los

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

sudo systemctl enable --now atd.service

los

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

ps -e | grep atd

los

Cómo utilizar el comando at de forma interactiva

Para usarlo, 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 usaremos de forma interactiva, 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:

at
at banana

Un uso incorrecto del

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

at now + 1 minute

los

at imprime un mensaje y un indicador de at, y espera a que escriba los comandos que desea programar. Primero, sin embargo, considere el mensaje, como se muestra a continuación:

los

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

  Cómo instalar SolydXK Linux

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

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

sh

los

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 comando de salida:

exit

No verá ningún mensaje de error o salida estándar de los comandos. Esto se debe a que el shell sh 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 comando at. 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 usan típicamente un sistema como enviar correo o sufijo. Si su sistema no tiene un sistema de correo electrónico interno, puede hacer que los scripts escriban en archivos o redirigir la salida a 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 en. Para este ejemplo, usaremos un pequeño archivo de script llamado sweep.sh que elimina los archivos * .bak, * .tmp y * .o. Escriba la ruta al comando, como se muestra a continuación, y luego presione Entrar.

los

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 en.

Presione Ctrl + D para indicar que ha terminado de agregar comandos. en shows , lo 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 de

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

mail

los

Si no hay correo, debe asumir el éxito. Por supuesto, en este caso, puede verificar y ver si los archivos * .bak, * .tmp y * .o se eliminaron para confirmar que el comando funcionó.

Escriba lo siguiente para ejecutar todo de nuevo:

at now + 1 minute

los

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

mail

los

¡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 at porque 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 con at. Aquí están algunos ejemplos:

Ejecutar a las 11:00 am:

at 11:00 AM

Ejecutar mañana a las 11:00 am:

at 11:00 AM tomorrow

Ejecutar a las 11:00 a.m. de este día la próxima semana:

at 11:00 AM next week

Ejecutar a esta hora, en este día, la próxima semana:

at next week

Corre a las 11:00 am el próximo viernes:

at 11:00 AM next fri

Ejecutar 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

Ejecutar a las 11:00 am en una fecha específica:

at 11:00 AM 3/15/2020

Ejecutar dentro de 30 minutos:

at now + 30 minutes

Ejecutar dentro de dos horas:

at now + 2 hours

Ejecutar mañana a esta hora:

at tomorrow

Ejecutar a esta hora el jueves:

at thursday

Ejecutar a las 12:00 am:

at midnight

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

Mirando la cola de trabajos

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

  Las 4 mejores aplicaciones de podcasts para Linux

Salida del

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

Identificación del trabajo
Cita agendada
Hora programada
Poner en cola el trabajo. Las colas están etiquetadas como “a”, “b”, etc. Las tareas normales con las que programa en van a la cola «a», mientras que las tareas que programa con el lote (que se tratan 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 es necesario utilizar at de forma interactiva; también puede usarlo en el comando. Esto facilita el uso de scripts internos.

Puede canalizar comandos a at, así:

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

Un

El trabajo es aceptado y programado por a las, 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 usar la opción -f (archivo) de la siguiente manera para pasar un nombre de archivo a at:

at now + 5 minutes -f clean.txt

Un

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

at now + 5 minutes 

Un

Removing Scheduled Jobs from the Queue

To remove a scheduled job from the queue, you can use the atrm command. If you want to see the queue first to find the number of the job you want to remove, you can use atq . Then, use that job number with atrm, as shown below:

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 comando atq le muestra los trabajos en la cola, pero no lo que van a hacer. Si desea ver una vista detallada de un trabajo, puede usar la opción -c (cat).

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

atq

Salida del

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

at -c 13

los

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 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: atiende la persona que recibe los correos electrónicos.
Cuarta línea: La Máscara de usuario es 22. Esta es la máscara que se usa para establecer los permisos predeterminados para cualquier archivo creado en esta sesión de 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.

Salida del

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

El comando por lotes

El comando por lotes opera de manera similar al mando, pero con tres diferencias significativas:

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

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

batch

los

A continuación, agregue tareas tal como lo haría con el comando at.

Controlar el acceso al comando at

Los archivos at.allow y at.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 se instala at.

Así es como funcionan estos:

at.deny: enumera las aplicaciones y entidades que no se pueden utilizar para programar trabajos.
at.allow: enumera quién puede usar at para programar trabajos. Si el archivo at.allow no existe, at solo usa el archivo at.deny.

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

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

sudo less /etc/at.deny

los

El archivo enumera los componentes del sistema operativo que no se pueden usar en. 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 archivo at.allow. Vamos a agregar a Dave y Mary, pero nadie más podrá usar en.

Primero, escribimos lo siguiente:

sudo gedit /etc/at.allow

los

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

Si alguien más intenta usar at, le dirán que no tiene permiso. Por ejemplo, digamos que un usuario llamado eric escribe lo siguiente:

at

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

Nuevamente, Eric no está en el archivo at.deny. Tan pronto como ingrese a alguien en el archivo at.allow, se le niega el permiso a todos y a todos los demás para usar at.

Ideal para ocasiones especiales

Como puede ver, tanto at como batch son 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 en.
Si desea ejecutar una tarea solo cuando la carga del sistema sea lo suficientemente baja, use batch.