Programar tareas en GNU/Linux con at y cron
Cuando trabajamos con sistemas informáticos, nos vemos en la necesidad de programar tareas para que se ejecuten en un momento determinado.
Si bien puede ser muy cómodo para un usuario de escritorio para, por ejemplo, realizar una copia de seguridad o un escaneo del antivirus, en un servidor nos será imprescindible para una gestión eficiente, como por ejemplo en la configuración de las «iptables», la ejecución de un «script» o comando, o la comunicación por correo-e de que una tarea se ha realizado.
Para esta tarea tenemos dos posibilidades, el comando «at», para programar una tarea por una sola vez, y «crontab» para hacerlo de manera reiterativa cuando indiquemos.
Sumario
- Comando «at», ejecución diferida
- Programar tarea
- Listar tareas programadas
- Cancelar tareas
- Cron y Crontab
- Listas de acceso
Comando «at», ejecución diferida
Si no lo tiene tu distribución, lo instalas como siempre desde los repositorios, primero actualizamos la lista de paquetes
sudo apt update sudo apt install at
Programar tarea
Se pueden programar trabajos (comando y secuencias de comandos) para ejecutar más tarde o en una fecha y hora determinada con el comando «at».
Cuando ejecuta un trabajo «at», se le asigna un número de identificación de trabajo junto con la extensión «.a». Esta designación se convierte en el nombre de archivo del trabajo y en su número de cola.
La sintaxis es sencilla. Invocamos la utilidad «at», el comando y establecemos la hora, dia y mes
Veámoslo con unos ejemplos.
NOTA: Para indicar el final de la introducción de comandos por la entrada estándar, se utiliza el carácter de fin de fichero (Ctrl-D)
Si queremos ejecutar comandos introducidos por la entrada estándar (teclado) a una hora determinada, digamos las 3:00 horas
at 03:00 AM at> comando_a_ejecutar (mkdir /home/javier/Crontab) at> Ctrl+D job 1 at Sat May 21 03:00:00 2022
Si necesitamos ejecutar un script a las 9 de la mañana
at 09:00 AM at> sh ruta/copiSec.sh at> Ctrl+D job 3 aat Sat May 21 09:00:00 2022
Si lo que queremos es ejecutar los comandos listados en un fichero al que llamaremos «tareas», el 28 de febrero a las 17:25
at -f tareas 17:25 may 28
Lógicamente, al ejecutar el comando sin crear el fichero previamente, nos dice que el fichero no existe.
Tenemos también, la opción «batch», que ejecuta comandos cuando los niveles de carga del sistema lo permiten; en otras palabras, cuando el promedio de carga cae por debajo de 1.5, o el valor especificado en la invocación de «atd».
Ver «man at» en tu terminal.
Listar tareas
La lista de tareas programadas está en /var/spool/cron/atjobs y la podemos consultar siendo root.
Pero lo normal será consultarla con «atq».
Y vemos las tareas programadas por el usuario actual.
Como vemos en la captura anterior, como usuario normal solo veremos las tareas del usuario actual, pero como root vemos las de todos los usuarios. Nos muestra el número de trabajo, la fecha de programación y el usuario que lo ha programado.
El comando «atq» solo nos muestra la lista de trabajos, pero si deseamos verificar el contenido de la tarea y qué secuencias de comandos o scripts están programados para esa tarea, lo podemos consultar ejecutando el comando con la opción «-c» y el número de tarea
at -c 1
Al final de la salida estandar, veremos el comando que hemos programado que se ejecute.
Cancelar tareas
Las tareas pueden cancelarse con «atrm» o «at -d»
Para borrar una tarea en concreto ejecutamos «atrm» y el número de tarea.
Como root podemos eliminar los trabajos programados de todos los usuarios.
Cron y Crontab
Cron es un demonio «daemon» que se ejecuta en segundo plano. Se utiliza para ejecutar periódicamente las tareas programadas especificadas en el fichero «crontab».
El funcionamiento es el siguiente. El sistema revisa el contenido del fichero de configuración «crontab» y verifica la fecha y hora en que se ha programado la ejecución del script, y el daemon «cron» inicia las tareas en el momento indicado.
Cada usuario posee su propio fichero de texto donde se indican las tareas programadas: «crontab»
En Debian y derivados, la configuración por defecto facilita insertar o eliminar nuevas tareas periódicas y automatizar la configuración de «cron» al instalar o desinstalar paquetes de software.
Ficheros de configuración
Los ficheros de configuración son:
- – /etc/crontab: crontab principal del sistema. En general, no es necesario modificarlo
- – /etc/cron.d/: cada archivo en este directorio se trata como un crontab del sistema. Facilita añadir nuevas tareas
- – /etc/cron.[hourly/daily/weekly/monthly]/: cada carpeta contiene scripts que se ejecutan una vez a la hora, día, semana o mes
El formato de los «crontab» del sistema en /etc/crontab y /etc/cron.d/ se describe en la página de manual crontab(5) y el de «cron» o consultar el manual en la terminal ejecutando
man crontab
Para editar el fichero «crontab» disponemos del comando siguiente. En Debian 11, nos ofrece editarlo con «nano» o con «vim».
crontab -e
O con nuestro editor favorito en /etc/crontab
Para establecer el momento en que se ha de ejecutar el script disponemos de las siguientes opciones:
Por ejemplo, para ejecutar el scrip «copiasec.sh», todos los días a las 8 y cuarto
15 8 * * * usuario /home/usuario/scripts/CopiSec.sh
Si quisiéramos que se ejecutara los 15 de agosto a las 20:30.
30 20 15 8 * usuario /home/usuario/scripts/CopiSec.sh
Hemos puesto un comentario que nos sirva de explicación y la programación del trabajo
También podemos utilizar cadenas especiales para definir las lineas
Anacron
En Debian y derivados, puede, y debe, instalarse «anacron» cuando el sistema no está operativo de forma continua. La configuración por defecto del sistema compatibiliza el uso conjunto de «cron» y «anacron».
Anacron ejecuta las tareas pendientes cuando se inicia el sistema, como aquellas tareas programadas en /etc/cron.daily/weekly/monthly.
Veamos unos ejemplos de administración
Para establecer «file» como «crontab» del usuario
crontab -f file
El super usuario «root», puede editar el «crontab» de cualquier usuario usando la opción «-u»
crontab -u usuario -e
Puedes encontrar más información en la página de manual crontab(5)
Listas de acceso
El uso de «at» y «cron» puede restringirse mediante listas de acceso. Esto se realiza creando los ficheros «at.allow», «at.deny», «cron.allow» y «cron.deny», los que necesitemos, todos en /etc. Estos ficheros contienen nombres de usuario, uno en cada línea y tantos como queramos. Vemos como funciona
Se permite el uso de «at» a un usuario si y sólo si
- – está listado en «at.allow», o bien
- – no está listado en «at.deny», pero el fichero existe (configuración por defecto)
Se permite el uso de «cron» a un usuario si y sólo si
- – está listado en «cron.allow», o bien
- – «cron.allow» no existe y no está listado en «cron.deny», o bien
- – no existen «cron.allow» ni «cron.deny» (configuración por defecto)
Para la administración de un sistema informático, «at» y «cron» son dos herramientas fundamentales. Por ejemplo, en un servidor cortafuegos, configurado con iptables, las reglas se deberán cargar cada vez que se reinicie el sistema. Con un script y «cron» lo hará automáticamente en cada reinicio.
Si tienes algún comentario que hacer sobre este artículo, al pie del post tienes un formulario para hacerlo.
Si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, en la página de contacto, tienes un formulario más adecuado.
Y para suscribirte y recibir las novedades publicadas, tienes un enlace en el pie de la página o desde aquí mismo.
Hay tareas que nunca las haría programadas, salvo contadas excepciones. Pasar el antivirus o hacer copia de seguridad cuando estoy haciendo otra cosa, y mermando me recursos, me toca un poco las narices
Gracias Barto por tu comentario. Como digo en el artículo, es fundamental para la gestión de servidores. Puedes, por ejemplo, hacer escaneo de puertos abiertos, consumo de ram, de cpu, tráfico, etc…y que te mande un correo-e con la información. Es fundamental en la administración de servidores, que suele ser en remoto en un cpd, sin tener que estar conectado 24/7