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

