J'ai eu le même problème, et j'ai trouvé un modèle qui utilise lockfile, un fichier pid qui contient le numéro d'identification du processus, et un fichier kill -0 $(cat $pid_file)
vérification pour que les scripts avortés n'arrêtent pas l'exécution suivante. Cela crée un dossier foobar-$USERID dans /tmp où se trouve le fichier lockfile et le fichier pid.
Vous pouvez encore appeler le script et faire d'autres choses, tant que vous gardez ces actions dans alertRunningPS
.
#!/bin/bash
user_id_num=$(id -u)
pid_file="/tmp/foobar-$user_id_num/foobar-$user_id_num.pid"
lock_file="/tmp/foobar-$user_id_num/running.lock"
ps_id=$$
function alertRunningPS () {
local PID=$(cat "$pid_file" 2> /dev/null)
echo "Lockfile present. ps id file: $PID"
echo "Checking if process is actually running or something left over from crash..."
if kill -0 $PID 2> /dev/null; then
echo "Already running, exiting"
exit 1
else
echo "Not running, removing lock and continuing"
rm -f "$lock_file"
lockfile -r 0 "$lock_file"
fi
}
echo "Hello, checking some stuff before locking stuff"
# Lock further operations to one process
mkdir -p /tmp/foobar-$user_id_num
lockfile -r 0 "$lock_file" || alertRunningPS
# Do stuff here
echo -n $ps_id > "$pid_file"
echo "Running stuff in ONE ps"
sleep 30s
rm -f "$lock_file"
rm -f "$pid_file"
exit 0