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.
Vielleicht hilft das dem einen oder anderen
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