¿Cómo verifico si se está ejecutando un script y lo hago en pausa hasta que esa instancia se haya completado para ejecutarse nuevamente?

¿Cómo verifico si se está ejecutando un script y lo hago en pausa hasta que esa instancia se haya completado para ejecutarse nuevamente?

Entonces ejecutamos este script que agrega datos a un archivo y estoy intentando agregar algo para verificar y ver si el script ya se está ejecutando. Si es así, quiero que haga una pausa y vuelva a verificar en 20 segundos y lo repita hasta que descubra que no se está ejecutando. En ese momento, me gustaría continuar con el resto del guión. Así que necesito saber cómo hacer que siga comprobando hasta que esté bien continuar. ¿Alguien tiene una idea?

    if [ `ps -ef| grep $script_name_with_arguments | wc -l ` -gt 1 ]
    then
      echo "already running"
      sleep 20s
    else
      echo "ok"
    fi
}```

Respuesta1

Utiliza algún tipo de bloqueo.

La forma más sencilla es un archivo de bloqueo. Hay algunos paquetes que los gestionarán por usted; No dijiste cuál era tu plataforma o distribución, así que no puedo ser muy preciso al respecto, pero una de ellas es el procmailpaquete que viene con el lockfileprograma.

Lo usarías en tu script de esta manera:

LOCK=/run/npaulsen/mylockfile.lock
lockfile -20 $LOCK
run_the_fscking_rest_of_my_script
rm -f $LOCK

Hay mejoras que puedes hacer para evitar que se bloquee indefinidamente en caso de que una instancia falle. Puedes leer la página de manual sobre eso: man 1 lockfile. O puede implementar el suyo propio; es trivial pero necesitará un lenguaje de programación real (no un script de shell).

Otra idea más sofisticada (pero también más compleja) sería utilizar semáforos POSIX; intentar man 7 sem_overview.

información relacionada