En este momento estás viendo Programar tareas en GNU/Linux con at y cron

Programar tareas en GNU/Linux con at y cron

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
Uso comando at

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
Ejemplo de uso del comando at

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 
Ejecución de comandos listados en el fichero «tareas»

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.

Salida de «man at»

Listar tareas

La lista de tareas programadas está en /var/spool/cron/atjobs y la podemos consultar siendo root.

Listado de tareas

Pero lo normal será consultarla con «atq».

Consulta de tareas programadas del usuario actual

Y vemos las tareas programadas por el usuario actual.

Consulta de tareas programadas por todos los usuarios

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
Ver el contenido de una tarea

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.

Borrar una tarea programada

Como root podemos eliminar los trabajos programados de todos los usuarios.

Borrar tareas como root

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
Ficheros de configuración

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
Salida de «man crontab»

Para editar el fichero «crontab» disponemos del comando siguiente. En Debian 11, nos ofrece editarlo con «nano» o con «vim».

crontab -e
Edición del fichero «crontab»
Contenido del fichero

O con nuestro editor favorito en /etc/crontab

El fichero «crontab» nos da información para la programación de tareas

Para establecer el momento en que se ha de ejecutar el script disponemos de las siguientes opciones:

Tabla de opciones de «crontab»

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
Programación para ejecución todos los 15 de agosto a las 8:30

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

Cadenas para programar la ejecución de tareas

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.

Esta entrada tiene 2 comentarios

  1. Barto

    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

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

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.