GNU/Linux >> Tutoriales Linux >  >> Linux

Entendiendo Crontab en Linux con ejemplos

El crontab se utiliza para automatizar todo tipo de tareas en sistemas Linux. Esta es una habilidad especialmente importante para los aspirantes a administradores de sistemas. Puede ser algo desafiante comenzar si eres un principiante. La sintaxis es diferente a la mayoría de los otros comandos. Por esta razón, esta lección incluirá un poco más de información básica antes de mostrarle algunos de los usos.

No se deje intimidar por crontab

Para mí, Crontab fue uno de los conceptos de Linux más intimidantes como novato. En el momento en que me presentaron 'crontab', había estado usando la línea de comandos durante solo unos días y apenas entendía cómo usar los comandos básicos de navegación de archivos como 'ls' y 'cd'.

La razón por la que menciono mi historial de aprendizaje personal es que espero que muchos nuevos usuarios de Linux se sientan igualmente abrumados cuando vean la sintaxis única de 'crontab'. Sin embargo, puedo asegurarte que no es tan complicado una vez que entiendes cómo funciona.

Lo que aprenderá en esta guía

Quiero dar una introducción rápida a algunos de los conceptos relacionados con crontab para que sea más fácil de entender. Mi objetivo es contextualizar estos conceptos e ilustrar cómo se relacionan entre sí.

  • Introducción rápida a los conceptos de Cron
  • Configurar el acceso Crontab para su cuenta de usuario
  • Manejar errores con sus cronjobs
  • Creación de tareas programadas

Introducción rápida a los conceptos clave de cron

Permítanme presentarles primero algunos conceptos básicos sobre 'cron'.

Diferencia entre Cron, Crontab y Cron Job

Ver las cosas visualmente ayuda a comprender nuevos temas más rápidamente. Aquí hay un desglose de cómo estos tres temas generalmente interactúan. Luego describiré cada uno con más detalle.

La tabla Cron

Crontab significa Tabla Cron. Este es un archivo del sistema Linux que crea una estructura similar a una tabla donde los campos están separados por espacios en blanco. Los usuarios pueden completar la tabla asignando valores a cada campo (asterisco).

A lo largo del artículo, podría usar un lenguaje diferente para describir esta idea. Para que quede claro un campo, celda, columna, etc. todos se refieren a lo mismo. Si te ayuda, puedes pensar en tu crontab como una mini-base de datos.

El trabajo cron

Si no está familiarizado con las bases de datos, puede imaginar las celdas en un archivo de Excel en blanco. De cualquier manera, para esta analogía cada asterisco representa una columna cuyo significado está definido por su encabezado. La columna final será una llamada para un comando o script. Cada fila completa se puede considerar como un trabajo individual. Estos a menudo se denominan "trabajos cron", aunque trabajo, tarea, etc. son términos intercambiables.

El demonio Cron

Ya hemos hablado de la mesa y de cómo la llenamos de puestos de trabajo. Pero, ¿cómo se ejecutan esos trabajos? Un proceso del sistema llamado Daemon se ejecuta en segundo plano en nuestra máquina Linux.

Hay Daemons para muchos servicios diferentes. Estos se nombran comúnmente agregando el sufijo 'd' al nombre de un servicio.

Naturalmente, el demonio cron se llama 'crond'. No se requiere ninguna acción de nuestra parte para ejecutar ese demonio, pero si cree que el comando no funciona correctamente, puede usar el comando ps para verificar que 'crond' se está ejecutando.

ps aux | grep crond

Este comando buscará los procesos actuales para todos los usuarios y devolverá cualquier instancia de 'crond'.

[email protected]:~$ ps ux | grep crond
christo+  8942  0.0  0.0  18612   840 pts/0    S+   02:16   0:00 grep --color=auto crond

Puedo ver que el daemon se está ejecutando para mi cuenta de usuario. Ya sabía esto porque he estado llenando un archivo todo el día con resultados.

Comprensión de la sintaxis de Crontab

Ahora que tiene una vaga comprensión de cómo funciona cron, veamos la sintaxis del uso de crontab. Espero que sea menos confuso si puedes visualizar esta información como una tabla en tu mente.

crontab [options]

* * * * *  <command> 
OR 
* * * * * <path/to/script>

Te prometo que esto te ayudará una vez que tengamos nuestro propio ejemplo en funcionamiento. Repasemos la sintaxis de los trabajos cron nuevamente.

Como puede ver, la sintaxis crontab tiene 5 asteriscos. Esto es lo que representa cada uno de esos asteriscos:

Elemento Nombre de Linux Significado
Demonio ‘crond’ Se pronuncia "demonio" o "día-mon". Estos son procesos del sistema en segundo plano de Linux.
Tabla ‘crontab’ Usted escribe filas en esta tabla cuando ingresa un comando crontab. Cada asterisco '*' representa un segmento de tiempo y una columna correspondiente en cada fila.
Trabajo Trabajo cron La tarea específica que se realizará descrita en una fila, junto con su ID de tiempo designado

NOTA:Los nombres de los días 0-6 comienzan con el domingo.

Para programar una tarea, reemplaza el asterisco apropiado con el valor deseado.

Pongámoslo en práctica rápida. Si tiene un crontab como el siguiente, ¿cuándo cree que se ejecutará el trabajo?

0 0 * * 0 

P:¿Cuándo se ejecutará el comando si configura el trabajo de esta manera?

A. Cada hora de lunes a sábado
B. Cada minuto los domingos
C. Solo a la medianoche de lunes a sábado
D. Solo a medianoche los domingos

La respuesta aquí es D. Ejecutar "comando" a las 00:00 [medianoche] todos los domingos.

Configura crontab cccess para tu cuenta de usuario

Crontab es específico del usuario. Ya lo tocaste un poco. Si cree que existe la posibilidad de que ya haya usado crontab antes, puede verificarlo usando crontab -l .

[email protected]:~$ crontab -l
no crontab for christopher

[email protected]:~$ crontab -e
no crontab for christopher - using an empty one

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

Choose 1-3 [1]: 1

Cuando ejecuto este comando, puede ver que no tengo crontab en este sistema.

Como aún no he creado un crontab, cuando uso -e para editar la tabla, me solicita mi editor de texto preferido. Nano se sugiere como el programa más fácil de usar. Puede usar cualquier editor de texto de línea de comando como Vim o Emacs. Realmente depende de ti.

Si al principio no tiene éxito, Sudo

Si intenta el crontab -e pero no obtiene este resultado, es posible que no tenga los privilegios de usuario para crear la tabla. Si tiene acceso a sudo, puede usar sudo para configurar el crontab.

sudo crontab -e <your_username>

Su sistema cargará automáticamente su crontab en el destino adecuado, que puede variar según la distribución, pero a menudo se encuentra en un directorio como /var/spool/cron/crontabs . No intente editar archivos aquí.

¿Qué sucede si el trabajo cron encuentra un error?

El comportamiento predeterminado es enviar por correo electrónico su salida. Esta función está diseñada para administradores que pueden enviar automáticamente registros a un correo electrónico "local" en el dominio de la red.

Puede configurarlo usted mismo si tiene un servidor de correo. También hay formas de automatizar la salida de correo electrónico a GMail o servicios similares. Sin embargo, esos métodos están más allá del alcance de este artículo.

En su lugar, veremos dos formas comunes de evitar el error.

1) Enviar salida a un archivo

Puede designar un archivo para enviar este tipo de salida y luego usar >> para redirigir la salida.

Usando >> agregará información a un archivo existente, mientras que un único > El símbolo sobrescribirá el archivo. Es importante saber esto si desea mantener un archivo de registro grande que actualice los registros con frecuencia. Ambos crearán automáticamente el archivo si no existe.

Ejemplo de trabajo cron:

0 * * * *  echo "Linux is Cool!" >> ~/crontab_log.txt

2) Usar /dev/null

Esto omitirá la opción de correo electrónico al eliminar, en esencia, los datos. El error estándar ('2') y la salida estándar ('1') se envían al archivo nulo.

0 0 * * * echo "Why are you silencing me every night at midnight?" > /dev/null 2>&1

Es posible que haya notado que estoy usando comandos de eco para los ejemplos. No hay una razón particular para eso, pero facilita la verificación de cambios y "verifica tu trabajo".

Si ha realizado algo de programación, es posible que haya utilizado comandos de impresión para probar su lógica. Este es el mismo concepto.

Intentemos configurar nuestro propio trabajo cron. Si ya has estado "siguiendo el juego", eso es genial. Si no, ahora es el momento de preparar ese terminal y divertirse.

Ejemplos de crontab:programación de comandos y scripts

Le mostré un par de ejemplos mientras explicaba cómo se enruta la salida. ¿Tuvieron sentido para ti?

Déjame explicarte el primer ejemplo.

2do 3ro 4to 5to
* * * * *
ID Minuto Hora Día-Fecha Mes Nombre del día
Valores 0-59 0 -23 1-31 1-12 0-6

Establecer el valor de los minutos en '0' significa que el comando se ejecutará cada hora, en punto.

Horarios de trabajo avanzados

Puede editar varios valores a la vez. Si lo desea, puede reemplazar los 5 asteriscos con especificaciones.

Minuto Hora Día-Fecha Mes Nombre del día Comando
0 * * * * echo "¡Linux es genial!">> ~/crontab_log.txt

¿Alguna idea de lo que dice este? Por el bien de este tutorial, hice este trabajo particularmente confuso. Sería inusual tener algo con tantos parámetros “en la naturaleza”, pero veamos si puedes descifrarlo. Para algo como esto, me gusta trabajar hacia atrás a través de los campos.

Intentémoslo juntos:

Minuto Hora Día-Fecha Mes Nombre del día Comando
*/5 3-6 */5 */2 0,6 echo "¡Linux es genial!">> ~/crontab_log.txt

En Lenguaje Sencillo:

Por lo tanto, cada dos meses, los fines de semana, independientemente de la fecha, este comando se ejecutará cada 5 minutos entre las 3 am y las 6 am.

Wow, eso fue enrevesado. Si pudiste seguir eso, estás preparado para cronear con los mejores.

Escriba un simple script de automatización cron para realizar copias de seguridad de archivos

Hasta este punto, los trabajos cron que ha escrito solo han hecho una cosa. Eso puede ser útil, pero tal vez quieras hacer varias tareas.

Afortunadamente, esto no solo es posible, sino también muy fácil. Si recuerda el ejemplo de sintaxis original, también puede usar una ruta a un script.

Esto no se limita solo a bash, también puede implementar un script que use Python o Perl si lo desea.

¿Cuáles son nuestros objetivos?

  • Los trabajos se procesarán a las 3 a. m. cada noche
  • Copia de seguridad de la carpeta /Documentos en un archivo zip
  • Genera un archivo de texto con una lista de todo lo que hay en el directorio
  • Cree una carpeta de archivo que clone nuestra copia de seguridad y el archivo de texto en una subcarpeta con la fecha actual

our_backup_script.sh

#! /bin/bash

DATE=$(date +%d-%m-%Y)
# Date in format DAY##-MONTH##-YEAR####

mkdir -p ~/archive/$DATE
# create a folder for today's date in the archive, if archive doesn't exist, make archive 
ls -al ~/Documents > ~/archive/$DATE/contents.txt
# create a text file listing the contents of the documents folder
cd ~/  && tar -cpzf $DATE.docs.backup.gz Documents/*
# change to parent directory to tar /Documents folder
cp ~/$DATE.docs.backup.gz ~/archive/$DATE/documents_archive.gz
# one .gz file is left in the home directory, a clone is sent to our archive under it's date
[email protected]:~$ ls
 Desktop     Downloads   Music                  Pictures   Public      Videos
 Documents   ENV         our_backup_script.sh   projects   Templates  'VirtualBox VMs'
[email protected]:~$ bash our_backup_script.sh 
[email protected]:~$ ls
 25-11-2019.docs.backup.gz   Documents   Music                  projects    Videos
 archive                     Downloads   our_backup_script.sh   Public     'VirtualBox VMs'
 Desktop                     ENV         Pictures               Templates
[email protected]:~$ ls archive/25-11-2019/
contents.all_files.txt  documents_archive.gz

Todo lo que queda por hacer es convertir este script en un trabajo cron.

crontab -e

Y agregue lo siguiente allí:

0 3 * * * bash ~/our_backup_script.sh

¿El tuyo tuvo éxito? el mio lo era De hecho, me gustó tanto la idea que podría mantener esto como una copia de seguridad diaria. Una modificación que haré es mover mi archivo a una carpeta en mi máquina que se sincroniza con el almacenamiento en la nube.

Otra forma de programar trabajos en Linux es usando el comando. Puede que también te interese aprender sobre eso.

¿Tienes alguna idea para un guión que quieras crear? ¿Te ayudó este artículo a comprender mejor crontab? Comparte con nosotros en los comentarios.


Linux
  1. Comando wc Linux con ejemplos

  2. Comando Linux Tee con ejemplos

  3. Comando de cabeza de Linux con ejemplos

  4. Comando JQ en Linux con ejemplos

  5. 6 ejemplos de comandos crontab de Linux

Comando Tr en Linux con ejemplos

15 comandos ps de Linux con ejemplos

Comando de CD de Linux con ejemplos

Linux Crontab:15 impresionantes ejemplos de trabajo de Cron

Cómo programar trabajos con Cron en Linux

10 ejemplos útiles de cron para programar trabajos en Linux

    Campo Valor Significado
    Nombre del día 0,6 Sábado y Domingo
    Mes */2 Cada mes que es divisible por 2 (pares) meses.
    Día Fecha * Cada fecha
    Hora 3-6 Entre las 3 y las 6 de la mañana
    Minutos */5 Cada 5 minutos