BASH: Nur eine Instanz eines Bash Skriptes starten

In einigen Fällen darf ein Skript nur eine Instanz starten, z.B. Aufbereitung für Backup. Für diesen Zweck hab ich hier das kleine Bespiel eingestellt.

Sollten mehrere Benutzer das Skript starten können ist natürlich darauf zu achten das sie alle Schreibrechte auf das PID File haben.
PIDFILE="$(dirname "$(readlink -f "$0")")/$(basename "${0}").pid"
Und hier das komplette Beispiel :
#!/bin/bash

function check_process () {
        # ------------------------- check_process -----------------------------
        # create an pid file for an bash script and check is it already running
        #
        # need 2 parameters : check_process [NAME_OF_PIDFILE] [NAME_OF_SCRIPT]
        # ---------------------------------------------------------------------

        cp_PID_FILE="${1}"
        cp_SCR_NAME="${2}"
        cp_RET=1
        if [[ -n "${cp_PID_FILE}" && -n "${cp_SCR_NAME}" ]]; then
                if [ -f "${cp_PID_FILE}" ]; then
                        # Pid File auslesen
                        pid=$(cat "${cp_PID_FILE}")
                        chkpid=$(ps -ax | grep "/bin/bash" | grep "/${cp_SCR_NAME}" | grep "${pid}" | grep -v grep)
                        if [ $? -ne 0 ]; then
                                rm "${cp_PID_FILE}"
                                cp_RET=0
                        else
                                # Skript läuft noch -> keine doppelte ausführung wird beendet
                                # Direkter Abbruch (auskommentieren)
                                # echo "the script is already running -> PID:${pid}"
                                # exit 1
                                # Rückgabewert
                                cp_RET=1

                        fi
                fi
        else
                echo "check parameters for function #> check_process"
                exit 9
        fi
        if [ ${cp_RET} -eq 0 ]; then
                echo $$ > "${cp_PID_FILE}"
        fi
        return ${cp_RET}
}
# --------------------------------------------------------------------
clear
PIDFILE="$(dirname "$(readlink -f "$0")")/$(basename "${0}").pid"
check_process "${PIDFILE}" "$(basename "${0}")"
if [ $? -eq 1 ]; then
        echo "Script läuft bereits"
        exit 99
fi
echo "readlink : " $(readlink -f "${0}")
echo "basename : " $(basename "${0}")
echo "pidfile  : " ${PIDFILE}
echo "---------------------------------"
# endlosschleife - debug
while true; do
printf "."
sleep 2
done


Vielleicht hilft das dem einen oder anderen ;-)
“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)