GNU/Linux >> Tutoriales Linux >  >> Linux

Uso de una secuencia de comandos contenedora de Cron

Este tutorial está destinado a hacer dos cosas:ampliar el artículo de solución de problemas de Cron; y para dar una visión general de un concepto de secuencias de comandos simple que utiliza la creación de un archivo como indicador para indicar que algo se está ejecutando. Esto es principalmente útil cuando necesita ejecutar algo continuamente, pero no más de una copia a la vez. Puede crear un archivo como indicador para verificar si un trabajo ya se está ejecutando y, a su vez, verificar ese indicador antes de realizar más acciones.

La aplicación directa de esto es cuando tiene un trabajo cron que se ejecuta cada minuto o cada pocos minutos. Con un cron que se repite rápidamente, si el trabajo anterior toma más tiempo que el programado, estas tareas pueden acumularse causando carga en el servidor o exacerbando otros problemas. Para evitar esto, se puede configurar un script simple en crontab (en lugar de la tarea cron prevista). Cuando se ejecuta el cron, solo ejecuta la tarea real si no hay un proceso competidor que ya se esté ejecutando.

¿Por qué usar un contenedor Cron?

Un envoltorio de cron se usa cuando tiene un trabajo de cron que necesita ejecutarse de forma consecutiva pero no debe pisarse a sí mismo. Esto es bueno para las tareas que desea configurar para que se ejecuten continuamente. Los trabajos que deben ejecutarse entre cada minuto y cada cinco minutos deben utilizar un envoltorio como este.

Si no usa un contenedor en un trabajo cron que se ejecuta con demasiada frecuencia, puede ejecutar varios trabajos al mismo tiempo tratando de hacer lo mismo. Estas tareas en competencia ralentizan todo el trabajo. Estos "trabajos cron de apilamiento" pueden incluso salirse tanto de control que sobrecargan un servidor y hacen que el servidor deje de responder normalmente.

¿Qué es un contenedor Cron?

La razón por la que esto se llama un envoltorio cron es que es un script que envuelve el trabajo cron y verifica si ya se está ejecutando otra instancia del cron. Si hay otra copia en ejecución, el contenedor hará que el cron omita esta ejecución y espere hasta la próxima ejecución para verificar nuevamente. Hay algunas formas en que los contenedores cron garantizan que no se superpongan.

Método de comprobación del proceso

Una forma es verificar todos los procesos en ejecución para el usuario y verificar que no haya otro proceso con el mismo nombre o atributos que el que desea ejecutar. Así es como funciona el archivo cron.sh de Magento, busca otra instancia de cron.php que se esté ejecutando como usuario y, si hay una en ejecución, se cierra. Esto puede ser complicado de hacer de forma fiable, por lo que no es algo que recomendaríamos para empezar.

Método de archivo de bloqueo

Un método directo es usar lo que se llama un archivo de bloqueo. El envoltorio cron verifica si el archivo de bloqueo (cualquier archivo con un nombre/ubicación específico) existe al comienzo de la ejecución. Si falta el archivo de bloqueo, el script crea ese archivo y continúa. La creación del archivo de bloqueo señala el inicio del trabajo cron. Cuando el trabajo cron completa la secuencia de comandos contenedora, elimina el archivo de bloqueo.

Mientras exista el archivo de bloqueo, un nuevo contenedor no ejecutará el resto del trabajo cron mientras se ejecuta otro. Una vez que se complete la primera ejecución y se elimine el bloqueo, otro contenedor podrá volver a crear un nuevo archivo de bloqueo y procesarlo normalmente.

Ejemplo de secuencia de comandos contenedora

Para comenzar, queremos crear un script bash simple. Dentro de un archivo indicamos el script a interpretar por el programa /bin/bash

#!/bin/bash

Luego queremos definir el nombre y la ubicación del archivo de bloqueo que usaremos como bandera.

# Set lockfile name and location
lockfile="~/tmp/cronwrapper.lock"

A continuación, el script debe verificar si existe ese archivo de bloqueo. Si existe, entonces ya se está ejecutando otra copia del script y debemos salir del script.

# Check if the lockfile exists
if [[ -f $lockfile ]]; then
# If the lockfile exists quit
exit;

De lo contrario, si el archivo de bloqueo no existe, debemos crear un nuevo archivo de bloqueo para indicar que continuamos con el resto del script. La creación del archivo de bloqueo también le indica a cualquier copia futura que se pueda ejecutar que espere hasta que se elimine el archivo de bloqueo. También queremos incluir el trabajo real que se ejecutará, ya sea una llamada a una URL a través de la web, la ejecución de un archivo PHP en la línea de comandos o cualquier otra cosa.

# If the lockfile is missing continue
else
# Create the lockfile
touch $lockfile
# Insert cron task here/code>

Una vez que el trabajo previsto se ejecuta y se completa, queremos limpiar nuestro archivo de bloqueo, de modo que la próxima ejecución del trabajo cron sepa que la última ejecución se completó y todo está listo para funcionar nuevamente.

# Cleanup the lockfile
rm -f $lockfile
fi

En el ejemplo anterior, es conveniente definir el archivo de bloqueo como una variable ($lockfile) para que pueda consultarse fácilmente más adelante. Además, si desea cambiar la ubicación, solo tiene que cambiarla en un lugar del script.

Este ejemplo también usa un "~" en la ruta al archivo de bloqueo como acceso directo. Esto le dice al shell que asuma el directorio de inicio del usuario. Como tal, la ruta completa se parecería más a esto:/home/username/tmp/cron.lock.

Sin embargo, al usar “~” puede usar copias del mismo script para muchos usuarios en el mismo servidor y no tener que modificar la ruta completa para cada usuario. El shell usará automáticamente el directorio de inicio para cada usuario cuando se ejecute el script contenedor.

Poniéndolo todo junto (cronwrapper.sh)

Puede copiar y pegar lo siguiente en el editor de texto de su elección en su servidor. Puedes ponerle el nombre que quieras, pero aquí están todas las partes juntas.

#!/bin/bash
lockfile="~/tmp/cronwrapper.lock"
if [[ -f $lockfile ]]; then
exit;
else
touch $lockfile
# Insert cron task here
rm -f $lockfile
fi

Este es un ejemplo muy simple y podría ampliarse mucho más. Idealmente, puede agregar una marca para ignorar un archivo de bloqueo de más de una hora y ejecutar una nueva instancia de trabajo cron de todos modos. Esto daría cuenta de un trabajo interrumpido que no pudo limpiar después de sí mismo. Otra extensión podría ser confirmar que el trabajo anterior se completó limpiamente. O aún otra sugerencia, verificaría si hay errores del trabajo cron que se está ejecutando y tomaría decisiones o enviaría alertas basadas en esos errores. ¡El mundo es tu ostra cuando se trata de envoltorios de cron! Eche un vistazo a nuestros servidores VPS de Liquid Web, para que tareas como estas se ejecuten sin problemas.


Linux
  1. ¿Cómo detectar la virtualización usando Sys::Detect::Virtualization Perl script?

  2. ¿Usando Notify-send con Cron?

  3. ¿Programar el script Apt-get usando Cron?

  4. ¿El trabajo de Cron no se ejecuta?

  5. Crontab Log:cómo registrar la salida de mi secuencia de comandos Cron

Cómo automatizar tareas en Linux usando Crontab

Instale fácilmente Golang en Linux usando el script Update-golang

Eliminar archivos de registro usando el trabajo cron

Obtenga la dirección MAC usando un script de shell

Transferir archivos usando lftp en bash script

¿Cómo salir de la terminal de Linux usando el script de Python?