Startskript kann trotz PID-Datei mehrfach ausgeführt werden

Startskript kann trotz PID-Datei mehrfach ausgeführt werden

Der Grund, warum ich dieses Skript erstelle, ist, dass ich supervisord als Daemon ausführen möchte: Im Moment befinde ich mich in einem Cloud-Host, in dem ich keinen Zugriff auf den /etcoder den sudoBefehl habe. Dieses Skript ist mein bester Versuch, alles von meinem aus zu tun /home. Ich habe dieses Bash-Skript mit dem start-stop-daemonBefehl, aber es ermöglicht mir, es mehrmals auszuführen, und ich möchte, dass es nur einmal ausgeführt wird. Bisher habe ich Folgendes erhalten:

#! /bin/bash 
SUPERVISORD=/usr/local/bin/supervisord
PIDFILE=/home/user/supervisor/supervisord.pid
OPTS="-c /home/user/supervisor/supervisord.conf -j $PIDFILE"

test -x $SUPERVISORD || exit 0

. /lib/lsb/init-functions

export PATH="${PATH:+$PATH:}/usr/local/bin:/usr/sbin:/sbin"

case "$1" in
start)
    log_begin_msg "Starting Supervisor daemon manager..."
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $SUPERVISORD -- $OPTS || log_end_msg 1
    log_end_msg 0
    ;;

stop)
    log_begin_msg "Stopping Supervisor daemon manager..."
    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE || log_end_msg 1
    log_end_msg 0
    ;;

restart|reload|force-reload)
    log_begin_msg "Restarting Supervisor daemon manager..."
    start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $PIDFILE
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $SUPERVISORD -- $OPTS || log_end_msg 1
    log_end_msg 0
    ;;

*)
    log_success_msg "Usage: {start|stop|reload|force-reload|restart}"
    exit 1
    ;;
esac

exit 0

Ich gehe davon aus, dass die PID-Datei beim Erstellen die vorherige überschreibt, sodass mehrere Stopps auch nicht funktionieren. Wie kann ich dieses Skript nur einmal ausführen und nicht mehrere Prozesse ausführen lassen, wenn ich „Skript starten“ fünfmal ausführe? Es sollte eine Meldung anzeigen, dass der Prozess bereits ausgeführt wird.

Antwort1

Ich habe herausgefunden, wo das Problem lag. Mein Skript überprüfte nicht, ob der Prozess bereits ausgeführt wurde, also startete es einfach so viele Prozesse, wie Sie ausführen, fügte aber hinzu:

    if [ -f $PIDFILE ]; then
      echo "supervisord already running: $PIDFILE" 
      exit 1 
    fi

in diesem start)Fall wurde mein Problem dadurch gelöst. Dadurch wird überprüft, ob supervisord die entsprechende PID-Datei generiert hat. Wenn diese vorhanden ist, geschieht nichts.

verwandte Informationen