Cómo evitar que los scripts de shell se ejecuten varias veces al mismo tiempo

  

Por ejemplo, hay un script mysql de respaldo periódico (cron), o un script rsync, si hay un accidente, el tiempo de ejecución es demasiado largo, es probable que el próximo ciclo de respaldo haya comenzado. El script para el ciclo actual aún no se ha ejecutado, obviamente no estamos dispuestos a que esto suceda.

De hecho, siempre que realices algunos cambios en el script, puedes evitar que se ejecute repetidamente.

# /bin /bashLOCK_NAME = "! /tmp/my.lock" si [[-e $ lock_name]]; thenecho " re-entrada, salida de " 1fi salida ### Colocación de la cerradura $ FileTouch LOCK_NAMEecho -n " Comenzó ... " ### Iniciar proceso normal ### Fin del proceso normal ### Eliminando lockrm -f $ LOCK_NAMEecho " Hecho. &Quot;

Cuando el script comienza a ejecutarse, Cree el archivo /tmp/my.lock. Si ejecuta este script nuevamente y descubre que existe my.lock, saldrá y eliminará el archivo cuando el script termine de ejecutarse.

En la mayoría de los casos, no hay nada de malo en hacer esto. Accidente 1) Si ejecuta este script dos veces al mismo tiempo, ambos procesos encontrarán que my.lock no existe y puede continuar ejecutándose. Accidente 2) Si el script se cierra inesperadamente durante la ejecución, no hay tiempo para eliminar el archivo my.lock, entonces es una tragedia.

Modifica de la siguiente manera:

#! /bin /bashLOCK_NAME = " /tmp/my.lock" if (set -o noclobber; echo " $$ " > " $ lock_name ") 2 > /dev /null; thentrap; INT TERM sALIDA ### comienza el flujo normal de ### termina flujo normal ### Extracción lockrm -f $ LOCK_NAMEtrap - 'rm -f " $ lock_name "; salida $?' INT PLAZO EXITelseecho " fallido para adquirir fichero de bloqueo: $ lock_name " echo " en Posesión de $ (cat $ lock_name) " 1fiecho salida de " Hecho "

set significado -o noclobber: < Br>

Si está configurado, bash no sobrescribe un archivo existente con los operadores de redirección >, > &, y < >.

Esto asegurará que my.lock solo pueda ser uno Se crea el proceso. Más fiable que el tacto.

trap puede capturar varias señales y luego procesarlas: INT se usa para controlar ctrl + c y cancelar la ejecución del script. TERM se utiliza para manejar kill -TERM pid. SALIR no está claro

Además, no es válido para kill -9. .

Recuerde que hace N años, en el grupo php, la gente de la hierba también hizo esta pregunta, la respuesta que dimos fue ps aux | Grep nombre de archivo | Wc -l, jaja, cierto 2.

Copyright © Conocimiento de Windows All Rights Reserved