Laufen Scripte automatisiert per cron job, ist darauf zu achten, dass diese nicht zweimal gestartet werden können. Situationen, in denen dieses Verhalten auftauchen kann, sind

    • Script läuft aufgrund von Systemlast länger als üblich,
    • Cron-Zeitfenster sind zu knapp hintereinander,
    • Script ist aufgrund eines Fehlers stehen geblieben.

    Um eine bereits laufende Instanz eines Scripts zu markieren, bietet sich die Verwendung von lock-Dateien an. Nachfolgend möchte ich dafür eine Funktionen vorstellen, die die Verwendung von Lock-Dateien vereinfachen.

    Die Function create_lockfile() erstellt ein Lockfile im Pfad des Scriptes mit der Endung .lock. Sollte dort bereits eine entsprechende Datei vorhanden sein, so beendet die Funktion das Script mit einer entsprechenden Meldung und gibt die process id des bereits laufenden scriptes aus.
    Innerhalb der Funktion wird darüber hinaus eine trap definiert. Diese sorgt dafür, dass das Lockfile auch dann gelöscht wird, wenn das Script abgebrochen wird, oder es aufgrund eines Fehlers beendet wird.

    function create_lockfile() {
      #######################################
      # Create lock file to avoid starting a script twice.
      # If lock file already exists script quits
      # Arguments:  None
      # Returns:    None
      #######################################
    
      declare lockfile=$(realpath $0).lock
    
      if [[ -e "${lockfile}" ]]; then
        ps_script=$(ps aux |grep $0)
        set -- ${ps_script}
        echo "Script $(realpath "${0}") ("${2}") is already running."
        exit 0
      fi
    
      touch "${lockfile}"
      trap "rm -f ${lockfile}; exit" INT TERM EXIT
    }

    Die Ausgabe bei doppelter Ausführung sieht dann wiefolgt aus.

    $ ./test.sh
    Script /tmp/test.sh (22418) is already running.

     

    Leave A Reply