Si desea programar un trabajo de Linux que ocurrirá solo una vez, cron
es exagerado. los at
familia de comandos es lo que necesitas! Y si desea ejecutar procesos solo cuando su sistema tenga recursos libres, puede utilizar batch
.
Cómo programar trabajos de Linux
los cron
demonio 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 al menos una vez al mes o al año, puede configurarla en cron
.
A pesar de esto, esto no ayuda si desea programar una tarea para que se ejecute solo una vez. Claro, puedes configurarlo en cron
, pero después debe recordar regresar y quitar el entrada crontab después de que se ejecuta la tarea, lo cual es inconveniente.
Con Linux, si está luchando con un obstáculo, es casi una garantía de que alguien más además ha luchado con él. Por suerte, debido a que los sistemas operativos similares a Unix han existido durante tanto tiempo, además existe una magnífica oportunidad de que alguien haya creado una solución a su problema.
Para el problema descrito previamente, lo han hecho y se llama at
.
RELACIONADO: Cómo programar tareas en Linux: Introducción a los archivos Crontab
Instalación del comando at
Tuvimos que instalar at
en Ubuntu 18.04 y Manjaro 18.1.0 (ya estaba instalado en Fedora 31).
Instalar at
en Ubuntu, use este comando:
sudo apt-get install at
Una vez completada la instalación, puede iniciar el at
demonio con este comando:
sudo systemctl enable --now atd.service
En Manjaro, instalas at
con este comando:
sudo pacman -Sy at
Una vez completada la instalación, escriba este comando para iniciar el at
demonio:
sudo systemctl enable --now atd.service
En cualquier distribución, puede escribir este comando para asegurarse de que atd
el demonio se está ejecutando:
ps -e | grep atd
Cómo usar el comando at de forma interactiva
Utilizar at
, debes de 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 post.
A pesar de esto, aún cuando vamos a usar at
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 «Tiempo ilegible», como se muestra a continuación:
at
at banana
Las fechas y horas pueden ser explícitas o relativas. A modo de ejemplo, digamos que desea que un comando se ejecute dentro de un minuto. at
sabe lo que significa «ahora», por lo que puede utilizar now
y agrégale un minuto, así:
at now + 1 minute
at
imprime un mensaje y un at
y espera a que escriba los comandos que desea programar. Primero, a pesar de esto, considere el mensaje, como se muestra a continuación:
Te dice at
lanza una instancia del sh
concha y voluntad ejecutar los comandos dentro de eso. Sus comandos no se ejecutarán en el shell Bash, que es compatible con el sh
shell pero tiene un conjunto de funciones más rico.
Si sus comandos o scripts intentan utilizar 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
. Usar el sh
comando para iniciar un sh
cascarón:
sh
El símbolo del sistema cambia a un signo de dólar ($
), y ahora puede ejecutar sus comandos y verificar que funcionen correctamente.
Para volver al shell Bash, escriba el exit
mando:
exit
No verá ningún mensaje de error o salida estándar de los comandos. Esto se debe a que sh
shell 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 email. Se envía a través del sistema de correo interno a quien ejecuta el at
mando. Esto significa que debe instalar y configurar ese sistema de email interno.
Muchos (la mayoría) de los sistemas Linux no disponen un sistema de email interno, dado 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 email interno, puede hacer que las secuencias de comandos 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 email 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 email.
RELACIONADO: ¿Qué son stdin, stdout y stderr en Linux?
Ahora es el momento de escribir un comando en at
. Para este ejemplo, usaremos un pequeño archivo de script llamado sweep.sh
que borra el *.bak
, *.tmp
, y *.o
archivos. Escriba la ruta al comando, como se muestra a continuación, y después presione Entrar.
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 decir at
ha terminado de agregar comandos. at
muestra
Después de que se ejecute el trabajo, escriba lo siguiente para verificar su correo interno:
Si no hay correo, debe hacerse cargo el éxito. De todos modos, en esta circunstancia, puede verificar y ver si el *.bak
, *.tmp
, y *.o
Los archivos se eliminaron para confirmar que el comando funcionó.
Escriba lo siguiente para ejecutar todo de nuevo:
at now + 1 minute
Después de un minuto, escriba lo siguiente para volver a revisar su correo:
¡Oye, tenemos correo! Para leer el mensaje número uno, presione 1 y después presione Enter.
Recibimos un email de at
debido a que los comandos en la secuencia de comandos generaron mensajes de error. En este ejemplo, no había archivos para quitar debido a que cuando ejecutamos el script previamente, los eliminó.
Presione D + Enter para quitar el email 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 usar con at
. Aquí están algunos ejemplos:
- Ejecutar a las 11:00 am:
- Ejecutar mañana a las 11:00 am:
- Ejecutar a las 11:00 a. M. De este día la semana que viene:
- Ejecutar a esta hora, en este día, la próxima semana:
- Corre a las 11:00 am el próximo viernes:
- Ejecutar a esta hora el próximo viernes:
- Ejecutar a las 11:00 am en esta fecha, el próximo mes:
- Ejecutar a las 11:00 am en una fecha específica:
- Ejecutar dentro de 30 minutos:
- Ejecutar dentro de dos horas:
- Ejecutar mañana a esta hora:
- Ejecutar a esta hora el jueves:
- Ejecutar a las 12:00 am:
- Ejecutar a las 12:00 pm:
- Si eres británico, inclusive puedes programar un comando para que se ejecute a la hora del té (4 p. M.):
Mirando la cola de trabajos
Puede escribir el atq
comando para ver la cola de trabajos programados, como se muestra a continuación.
Para cada comando en la cola, atq
muestra la próxima 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. Tareas normales con las que programa
at
entrar en la cola «a», mientras que las tareas que programa conbatch
(que se tratan más adelante en este post) entran en la cola «b». - La persona que programó el trabajo.
Usando at en la línea de comando
No debes de utilizar at
interactivamente; además puede usarlo en el comando. Esto facilita el uso de scripts internos.
Puede canalizar comandos a at
, como esto:
echo "sh ~/sweep.sh" | at 08:45 AM
El trabajo es aceptado y programado por at
, y el número de trabajo y la fecha de ejecución se informan como antes.
RELACIONADO: Cómo utilizar Pipes en Linux
Utilizar at con archivos de comandos
Además puede almacenar una secuencia de comandos en un archivo y después pasarla a at
. Puede ser un archivo de comandos de texto sin formato, no tiene que ser un script ejecutable.
Puedes utilizar el -f
(archivo) de la próxima manera para pasar un nombre de archivo a at
:
at now + 5 minutes -f clean.txt
Puede lograr el mismo resultado si redirige el archivo a at
:
at now + 5 minutes < clean.txt
Eliminación de trabajos programados de la cola
Para quitar un trabajo programado de la cola, puede usar el atrm
mando. Si desea ver la cola primero para hallar el número del trabajo que desea quitar, puede utilizar atq
. Posteriormente, use ese número de trabajo con atrm
, Como se muestra abajo:
atq
atrm 11
atq
Cómo ver una vista detallada de los trabajos
Como ya mencionamos previamente, puede programar trabajos en el futuro. A veces, es factible que olvide lo que va a hacer un trabajo. los atq
El comando muestra los trabajos en la cola, pero no lo que van a hacer. Si desea ver una vista detallada de un trabajo, puede usar el -c
(gato) opción.
Primero, usaremos atq
para hallar el número de trabajo:
atq
Ahora, usaremos el trabajo número 13 con el -c
opción:
at -c 13
Aquí hay un desglose de la información que obtenemos sobre el trabajo:
- Primera linea: Esto nos dice que los comandos se ejecutarán bajo el
sh
cascarón. - Segunda linea: 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
at
mando. - Tercera línea: La persona que recibe los correos electrónicos.
at
envía. - Cuarta línea: los Máscara de usuario es 22. Esta es la máscara que se utiliza para determinar los permisos predeterminados para cualquier archivo creado en este
sh
sesión. La máscara se resta de 666, lo que nos da 644 (el idéntico octal derw-r--r--
). - Datos restantes: La mayoría son variables de entorno.
- Resultados de una prueba. Una prueba verifica para asegurarse de que se pueda entrar 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 aún cuando el script en nuestro ejemplo anterior se escribió para ejecutarse en Bash, aún se ejecutará en un
sh
cascarón.
El comando por lotes
los batch
mando opera de manera similar al at
comando, pero con tres diferencias significativas:
- Solo puedes utilizar el
batch
comando de forma interactiva. - En lugar de programar trabajos para que se ejecuten en un momento específico, los agrega a la cola y el
batch
El comando los ejecuta cuando la carga media del sistema es inferior a 1,5. - Debido a lo anterior, nunca especifica una fecha y hora con el
batch
mando.
Cuando utiliza el batch
comando, lo llama por su nombre sin parámetros de línea de comando como este:
batch
A continuación, agregue tareas tal como lo haría con el at
mando.
Controlar el acceso al comando at
los at.allow
y at.deny
los archivos controlan quién puede utilizar el at
familia de comandos. Estos se encuentran dentro del /etc
directorio. Por defecto, solo el at.deny
archivo existe y se crea cuando at
esta instalado.
Así es como funcionan estos:
at.deny
: Enumera las aplicaciones y entidades que no pueden utilizarat
para programar trabajos.at.allow
: Listas que pueden utilizarat
para programar trabajos. Si elat.allow
el archivo no existe,at
solo utiliza elat.deny
expediente.
De forma predeterminada, cualquiera puede utilizar at
. Si desea restringir quién puede usarlo, use el at.allow
archivo para enumerar los que pueden. Esto es más fácil que agregar a todos los que no pueden utilizar at
al at.deny
expediente.
Esto es lo que at.deny
el archivo se parece a:
sudo less /etc/at.deny
El archivo enumera los componentes del sistema operativo que no pueden utilizar at
. Muchos de estos no pueden hacerlo por razones de seguridad, por lo que no desea quitar ninguno del archivo.
Ahora, editaremos el at.allow
expediente. Vamos a agregar dave
y mary
, pero nadie más podrá utilizar at
.
Primero, escribimos lo siguiente:
sudo gedit /etc/at.allow
En el editor, agregamos los dos nombres, como se muestra a continuación, y después guardamos el archivo.
Si alguien más intenta utilizar at
, le dirán que no tiene permiso. A modo de ejemplo, digamos que un usuario llamado eric
escribe lo siguiente:
at
Sería rechazado, como se muestra a continuación.
De nuevo, eric
no está en el at.deny
expediente. Tan pronto como pongas a alguien en el at.allow
archivo, a todos los demás se les niega el permiso para utilizar at
.
Genial para ocasiones excepcionales
Como puede ver, ambos at
y 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 procedimiento regular, prográmelo con
at
. - Si desea ejecutar una tarea solo cuando la carga del sistema es lo suficientemente baja, utilice
batch
.