Programación de tareas con at y cron en Linux

CompTIABeginner
Practicar Ahora

Introducción

En esta práctica de laboratorio, aprenderás los fundamentos de la programación de tareas en un entorno Linux. Explorarás dos utilidades esenciales de la línea de comandos: at para programar trabajos que se ejecutan una sola vez en un momento futuro específico, y cron para automatizar tareas recurrentes que deben ejecutarse de forma regular, ya sea diaria, semanal o mensualmente.

Comenzarás preparando el entorno de laboratorio, asegurándote de que los servicios at y cron estén instalados y activos. Luego, practicarás la creación de un trabajo único con el comando at y la gestión de la cola de trabajos con atq y atrm. Finalmente, utilizarás el comando crontab para crear, verificar y eliminar un trabajo de cron recurrente, lo que te proporcionará experiencia práctica en la automatización de tareas de administración de sistemas.

Esta es una Práctica Guiada, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y ganar experiencia práctica. Los datos históricos muestran que esta es una práctica de nivel principiante con una tasa de finalización del 95%. Ha recibido una tasa de valoraciones positivas del 99% por parte de los alumnos.

Preparar el entorno del laboratorio

En este paso, prepararás el entorno del laboratorio instalando las herramientas necesarias para programar tareas en Linux. Las dos herramientas principales que utilizaremos son at para tareas puntuales y cron para tareas recurrentes. Aunque cron suele venir preinstalado en la mayoría de los sistemas Linux, es posible que la utilidad at deba instalarse manualmente.

Primero, actualicemos la lista de paquetes para asegurarnos de que podemos obtener la versión más reciente del software.

sudo apt-get update

Verás la salida a medida que las listas de paquetes se descargan de los repositorios.

A continuación, instala el paquete at utilizando el comando apt-get. El parámetro -y confirma automáticamente la instalación, por lo que no se te pedirá intervención.

sudo apt-get install -y at

La salida mostrará el progreso de la instalación. Una vez finalizada, el comando at estará disponible en tu sistema.

El comando at depende de un servicio en segundo plano (demonio) llamado atd para ejecutar los trabajos programados. Necesitamos asegurarnos de que este servicio esté funcionando. Puedes comprobar su estado con el comando systemctl.

sudo systemctl status atd

La salida debería indicar que el servicio está active (running).

● atd.service - Deferred execution scheduler
     Loaded: loaded (/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
     Active: active (running) since <date_time>; <time_ago>
       Docs: man:atd(8)
   Main PID: <pid> (atd)
      Tasks: 1 (limit: 4622)
     Memory: 248.0K
        CPU: 11ms
     CGroup: /system.slice/atd.service
             └─<pid> /usr/sbin/atd -f

Si el servicio no está activo, puedes iniciarlo con el siguiente comando:

sudo systemctl start atd

Finalmente, verifiquemos que el servicio cron también esté activo, ya que lo utilizaremos en un paso posterior.

sudo systemctl status cron

La salida también debería mostrar active (running), confirmando que el demonio cron está listo para gestionar las tareas programadas.

● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since <date_time>; <time_ago>
       Docs: man:cron(8)
   Main PID: <pid> (cron)
      Tasks: 1 (limit: 4622)
     Memory: 1.1M
        CPU: 40ms
     CGroup: /system.slice/cron.service
             └─<pid> /usr/sbin/cron -f

Con ambos servicios atd y cron en funcionamiento, tu entorno está ahora totalmente preparado para la programación de procesos.

Programar un trabajo único con el comando at

En este paso, aprenderás a utilizar el comando at para programar una tarea que se ejecutará una sola vez en el futuro. Esto es útil para ejecutar scripts o comandos que no necesitas ejecutar de inmediato, pero que tampoco requieren repetirse de forma regular. El comando at lee una serie de comandos de la entrada estándar y los agrupa en un único "at-job" que se ejecutará a la hora especificada.

Vamos a programar un comando sencillo que creará un archivo llamado at_output.txt en tu directorio de proyecto actual (~/project). Lo configuraremos para que se ejecute dentro de un minuto.

Primero, invoca el comando at con la especificación de tiempo deseada.

at now + 1 minute

Después de pulsar Enter, el prompt de tu terminal cambiará a at>. Esto indica que at está esperando a que introduzcas los comandos que deseas programar. Ahora, escribe el comando para crear el archivo y escribir algo de texto en él.

echo "The at job executed successfully." > ~/project/at_output.txt

Pulsa Enter después de escribir el comando. Para finalizar el trabajo y salir del prompt at>, presiona Ctrl-D (mantén presionada la tecla Ctrl y pulsa D). Verás un mensaje de confirmación de que el trabajo ha sido programado, junto con su número de trabajo y la hora de ejecución.

warning: commands will be executed using /bin/sh
job 1 at Mon Jan 1 12:01:00 2024

Ahora, debes esperar un minuto para que se ejecute el trabajo programado.

Transcurrido el minuto, puedes verificar que el trabajo se ejecutó comprobando la existencia del archivo at_output.txt. Utiliza el comando ls -l para ver los detalles del archivo.

ls -l ~/project/at_output.txt

Si el trabajo se ejecutó correctamente, el archivo aparecerá en la lista.

-rw-r--r-- 1 labex labex 35 Jan  1 12:01 /home/labex/project/at_output.txt

A continuación, visualiza el contenido del archivo con el comando cat para asegurarte de que el comando echo funcionó como se esperaba.

cat ~/project/at_output.txt

Deberías ver la siguiente salida en tu terminal:

The at job executed successfully.

Por último, para mantener limpio tu directorio de proyecto para los siguientes pasos, elimina el archivo que acabas de crear.

rm ~/project/at_output.txt

Has programado, verificado y limpiado con éxito un trabajo de una sola ejecución utilizando el comando at.

Gestionar trabajos pendientes con atq y atrm

En este paso, aprenderás a visualizar y cancelar trabajos programados con at. Es común programar una tarea y luego darse cuenta de que ya no es necesaria o que debe modificarse. El comando atq permite ver la cola de trabajos pendientes y el comando atrm permite eliminarlos.

Primero, programemos un trabajo lo suficientemente lejos en el futuro para que tengamos tiempo de gestionarlo. Programaremos un comando para que se ejecute en 10 minutos.

at now + 10 minutes

En el prompt at>, introduce un comando para crear un archivo. Llamaremos al archivo temporary_job.txt.

touch ~/project/temporary_job.txt

Pulsa Enter y luego Ctrl-D para guardar el trabajo. El sistema confirmará la creación del trabajo y mostrará su número de identificación. Toma nota de este número de trabajo, ya que lo necesitarás para eliminarlo.

warning: commands will be executed using /bin/sh
job 2 at Mon Jan 1 12:10:00 2024

(Nota: Tu número de trabajo y la hora serán diferentes).

Ahora, para ver la lista de todos tus trabajos pendientes, utiliza el comando atq (at queue).

atq

La salida mostrará tu trabajo programado, indicando su número de trabajo, la fecha y hora programadas, la cola en la que se encuentra (a) y el usuario que lo programó.

2 Mon Jan 1 12:10:00 2024 a labex

Supongamos que has decidido que ya no quieres que se ejecute este trabajo. Puedes cancelarlo utilizando el comando atrm (at remove), seguido del número de trabajo que anotaste anteriormente.

Sustituye <job_number> en el siguiente comando por tu número de trabajo real. Por ejemplo, si tu número de trabajo fuera 2, ejecutarías atrm 2.

atrm <job_number>

El comando no producirá ninguna salida si elimina el trabajo correctamente.

Para verificar que el trabajo ha sido eliminado de la cola, ejecuta atq de nuevo.

atq

Esta vez, el comando no debería producir ninguna salida. Este silencio confirma que tu cola de trabajos at está vacía y que el archivo temporary_job.txt no se creará.

Crear un trabajo recurrente con crontab -e

En este paso, aprenderás a programar una tarea recurrente utilizando cron. A diferencia de at, que ejecuta un trabajo una sola vez, cron está diseñado para ejecutar trabajos repetidamente según un horario. Gestionarás tus trabajos programados en un archivo especial llamado crontab.

Para editar el archivo crontab de tu usuario, utiliza el comando crontab -e. La -e significa "edit" (editar).

Abramos el archivo crontab para editarlo.

crontab -e

Si es la primera vez que ejecutas crontab -e, es posible que se te pida que elijas un editor de texto predeterminado. Recomendamos nano porque es fácil de usar.

Select an editor. To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  ...

Choose 1-2 [1]:

Pulsa 1 y luego Enter para seleccionar nano. Se abrirá el archivo crontab. Estará mayoritariamente vacío, a excepción de algunos comentarios que explican cómo usarlo.

Una entrada de crontab tiene un formato específico con seis campos:
minuto hora día-del-mes mes día-de-la-semana comando

Un asterisco (*) en un campo de tiempo actúa como comodín, lo que significa "todos/cada". Para nuestra tarea, queremos ejecutar un comando cada minuto. Esto es perfecto para realizar pruebas porque no tenemos que esperar mucho para ver el resultado. La programación para "cada minuto" es * * * * *.

Ahora, añade una nueva línea al final del archivo para programar un trabajo que añada la fecha y hora actuales a un archivo de registro llamado cron_log.txt en tu directorio de proyecto.

* * * * * date >> ~/project/cron_log.txt

Después de añadir la línea, tu editor debería verse algo parecido a esto:

## Edit this file to introduce tasks to be run by cron.
#
## Each task to run has to be defined through a single line
## indicating with different fields when the task will be run
## and what command to run for the task
#
## To define the time you can provide concrete values for
## minute (m), hour (h), day of month (dom), month (mon),
## and day of week (dow) or use '*' in these fields (for 'any').
#
## Notice that tasks will be started based on the cron's system
## daemon's notion of time and timezones.
#
## Output of the crontab jobs (including errors) is sent through
## email to the user the crontab file belongs to (unless redirected).
#
## For example, you can run a backup of all your user accounts
## at 5 a.m. every week with:
## 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
## For more information see the manual pages of crontab(5) and cron(8)
#
## m h  dom mon dow   command
* * * * * date >> ~/project/cron_log.txt

Para guardar el archivo y salir de nano, presiona Ctrl-X, luego presiona Y para confirmar los cambios y, por último, presiona Enter para escribir en el archivo.

Una vez que salgas, verás un mensaje de confirmación en tu terminal:

crontab: installing new crontab

Esto significa que tu nuevo trabajo de cron está activo. El demonio cron revisará ahora este archivo cada minuto y ejecutará tu comando.

Espera al menos un minuto. Luego, verifica que se haya creado el archivo de registro.

ls -l ~/project/cron_log.txt

Deberías ver el archivo en la lista.

-rw-r--r-- 1 labex labex 29 Jan  1 12:15 /home/labex/project/cron_log.txt

Ahora, visualiza su contenido.

cat ~/project/cron_log.txt

La salida mostrará la fecha y la hora en que se ejecutó el comando por primera vez.

Mon Jan  1 12:15:01 UTC 2024

Si esperas otro minuto y vuelves a ejecutar el comando cat, verás una nueva línea con una marca de tiempo actualizada, lo que demuestra que el trabajo se está ejecutando repetidamente.

Verificar y eliminar un trabajo de cron con crontab -l y -r

En este paso final, aprenderás a ver tus trabajos de cron programados sin abrir el editor y cómo eliminarlos por completo. Estas son tareas de gestión esenciales para mantener las tareas programadas de tu sistema organizadas y limpias.

Primero, listemos los trabajos de cron actualmente activos. El comando crontab -l (donde -l significa "list") muestra el contenido de tu archivo crontab directamente en la terminal.

crontab -l

La salida mostrará el trabajo que creaste en el paso anterior.

## Edit this file to introduce tasks to be run by cron.
## ... (otros comentarios) ...
## m h  dom mon dow   command
* * * * * date >> ~/project/cron_log.txt

Este comando es una forma segura y de solo lectura de comprobar qué trabajos están programados.

Ahora, supongamos que ya no necesitas este trabajo recurrente. Para eliminarlo, puedes usar el comando crontab -r (donde -r significa "remove"). Ten mucho cuidado con este comando, ya que elimina todo el archivo crontab de tu usuario sin pedir confirmación.

Ejecuta el comando para eliminar tu crontab.

crontab -r

El comando no producirá ninguna salida si se realiza con éxito.

Para verificar que tu crontab ha sido borrado, ejecuta de nuevo el comando de listado.

crontab -l

Esta vez, el comando devolverá un mensaje de error indicando que ya no tienes un archivo crontab.

no crontab for labex

Esto confirma que tu trabajo programado ha sido eliminado con éxito y no volverá a ejecutarse.

Finalmente, para completar el laboratorio y limpiar tu espacio de trabajo, elimina el archivo cron_log.txt que fue creado por el trabajo de cron.

rm ~/project/cron_log.txt

Has listado, eliminado y verificado con éxito la eliminación de un trabajo de cron, completando así todo el ciclo de vida de gestión.

Resumen

En esta práctica de laboratorio, has aprendido a preparar un entorno Linux para la programación de tareas instalando el paquete at y verificando que los servicios atd y cron estuvieran activos. Practicaste la programación de un trabajo único para su ejecución futura mediante el comando at. También aprendiste a gestionar estos trabajos pendientes visualizando la cola con atq y eliminando un trabajo específico con atrm.

Además, exploraste cómo programar tareas recurrentes utilizando cron. Utilizaste el comando crontab -e para editar el archivo crontab del usuario y añadir un nuevo trabajo automatizado. Por último, aprendiste a verificar la lista de trabajos de cron programados actualmente con crontab -l y cómo eliminar todos los trabajos de cron programados de un usuario mediante el comando crontab -r.