Startdaemon unter Debian erstellen



  • Hallo,

    ich habe vor Jahren ein Startscript (/sh) für SUSE Linux erstellt, das mir anhand einer Liste alle zugehörige Programme beim Systemstart als Daemon startet. (/etc/init.d/ ... Verzeichnis)

    Später habe ich das Script umgestellt auf /bash über einen Service gestartet ... systemctl start mein script usw. funktionierte auch gut.

    Nun habe ich auf Debian umgestellt und hier funktionieren nicht einmal die Befehle.
    Ich habe es mit "start-stop-daemon", siehe unten, ... eventuell habe ich auch einen falschen Ansatz ...

    Wie könnte ich dies lösen, pro Anwendung einen eigenen Service möchte ich nicht machen?
    (Können mehr als 30 Programme sein)

    #!/bin/bash
    #
    #
    ################################################################################
    
    benutzername="xxx"
    
        programme= (
    		"/usr/share/visual/PKLS7_Z -- -plcname Z"
    		"/usr/share/visual/PKLS7_T1 -- -plcname KC"
                   "/usr/share/visual/PKLS7_KE -- -plcname KY"
    
                   x.
                   y. 
                   z.
    
    		)
    
    #####################################################################################
    sigkill(){ stoppen; exit 0; }
    sigterm(){ stoppen; exit 0; }
    sigint(){ stoppen; exit 0; }
    sighup(){ stoppen; sleep 5; starten; }
    #####################################################################################
    starten()
    {
            echo "Starting Visual-System"
    	for (( s=0; s < (${#programme[*]}); s++));
    	    do
    	      echo "Starting ${programme[s]}"
    	      /sbin/start-stop-daemon --start --background --exec ${programme[s]} 
    	    done
    }
    #####################################################################################
    stoppen()
    {
            echo "Shutting down Visual-System"
    	for (( s=${#programme[*]}-1; s >= 0 ; s--));
    	    do
    	      prog=`echo "${programme[s]}" | awk -F" " '{print $1}'`
    	      prog=`echo $prog | sed -e "s/ //"`
    	      echo "Shutting down $prog"
    #	      killproc -TERM $prog
    	      /sbin/start-stop-daemon --stop --exec ${programme[s]}
    	done
    }
    #####################################################################################
    
    trap 'sigterm' SIGTERM	# Prozess normal beenden
    trap 'sigkill' SIGKILL	# Prozess sofort beenden
    trap 'sigint'  SIGINT	# STRG+C
    trap 'sighup'  SIGHUP   # Reload
    
    	starten;
    
    	while true
    	do
    	    sleep 2
    	done
    

    Danke
    worst_case



  • Ein modernes Systemd-Service-Unit-File ist für Debian die stabilste und sauberste Lösung, um Programme beim Systemstart im Hintergrund auszuführen.

    Die Nutzung von start-stop-daemon in einem blockierenden Bash-Skript bricht oft ab, wenn Kindprozesse abstürzen oder Signale nicht korrekt weitergeleitet werden. Systemd übernimmt das Prozessmanagement, das Rechtemangement (benutzername), automatische Restarts und das saubere Stoppen nativ.

    1. Service-Datei erstellen:

    /etc/systemd/system/visual-prog@.service:

    [Unit]
    Description=Visual-System Komponente: %I
    After=network.target
    
    [Service]
    Type=simple
    User=xxx
    ExecStart=/usr/share/visual/PKLS7_%I
    Restart=always
    RestartSec=5
    
    [Install]
    WantedBy=multi-user.target
    
    1. Instanzen aktivieren und starten:
    # Systemd über neue Datei informieren
    sudo systemctl daemon-reload
    
    # Autostart für die drei Programme aktivieren
    sudo systemctl enable visual-prog@Z.service
    sudo systemctl enable visual-prog@T1.service
    sudo systemctl enable visual-prog@KE.service
    
    # Programme sofort starten
    sudo systemctl start visual-prog@Z.service visual-prog@T1.service visual-prog@KE.service
    

    Hinweis: Diese Antwort wurde mit KI-Unterstützung erstellt. KIs können sich irren.

    Alternativ wäre hier dein adaptiertes (nach Bash übersetztes) Skript:

    #!/bin/bash
    
    # Konfiguration
    benutzername="xxx"
    
    # Format: "PFAD_ZUM_PROG|ARGUMENTE" (Getrennt durch das Rohr-Symbol '|')
    programme=(
        "/usr/share/visual/PKLS7_Z|-- -plcname Z"
        "/usr/share/visual/PKLS7_T1|-- -plcname KC"
        "/usr/share/visual/PKLS7_KE|-- -plcname KY"
    )
    
    stoppen() {
        echo "Shutting down Visual-System..."
        # Rückwärts durch die Liste gehen zum Stoppen
        for (( s=${#programme[@]}-1; s >= 0 ; s-- )); do
            IFS="|" read -r prog args <<< "${programme[s]}"
            echo "Stopping $prog"
            /sbin/start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --exec "$prog"
        done
    }
    
    starten() {
        echo "Starting Visual-System..."
        for (( s=0; s < ${#programme[@]}; s++ )); do
            IFS="|" read -r prog args <<< "${programme[s]}"
            echo "Starting $prog mit Args: $args"
            # --chuid wechselt den Benutzer, --make-pidfile und --pidfile sichern die Prozess-ID
            /sbin/start-stop-daemon --start --background --chuid "$benutzername" --make-pidfile --pidfile "/var/run/visual-$(basename "$prog").pid" --exec "$prog" -- $args
        done
    }
    
    # Signal-Handling (SIGKILL kann nicht abgefangen werden)
    trap 'stoppen; exit 0' SIGTERM SIGINT
    trap 'stoppen; sleep 5; starten' SIGHUP
    
    # Hauptprogramm
    starten
    
    while true; do
        sleep 2
    done
    
    1. Skript als Systemd-Dienst einbinden:
    [Unit]
    Description=Visual-Starter Skript
    After=network.target
    
    [Service]
    Type=simple
    ExecStart=/usr/local/bin/visual-starter.sh
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target
    
    1. Dienst aktivieren:
    sudo chmod +x /usr/local/bin/visual-starter.sh
    sudo systemctl daemon-reload
    sudo systemctl enable --now visual-starter.service
    

    Fazit & Empfehlung:

    Wähle Option 1 (Systemd-Template), wenn die Programme unabhängig voneinander laufen können und eine ausfallsichere, moderne Produktion-Umgebung gewollt ist.

    Wähle Option 2 (Bash-Skript), wenn die Programme zwingend in einer bestimmten Reihenfolge (First-In, Last-Out) starten/stoppen müssen oder die Startparameter zu unterschiedlich für ein Template sind.

    Um zu überprüfen, ob deine Dienste korrekt laufen, bietet Systemd hierfür sehr präzise Werkzeuge:

    1. Status der einzelnen Instanzen prüfen:
    sudo systemctl status visual-prog@Z.service
    sudo systemctl status visual-prog@T1.service
    sudo systemctl status visual-prog@KE.service
    
    1. Gesamtübersicht aller Instanzen prüfen:
    sudo systemctl list-units "visual-prog@*"
    
    1. Live-Logs der Programme einsehen:
    sudo journalctl -f -u visual-prog@Z -u visual-prog@T1 -u visual-prog@KE
    

    Bei Option 2 (Bash-Skript):

    1. Status des Haupt-Dienstes prüfen:
    sudo systemctl status visual-starter.service
    
    1. Prüfen, ob die Hintergrundprozesse wirklich laufen:
    ps aux | grep -E "PKLS7|visual-starter"
    
    1. Prüfen, ob PID-Dateien angelegt wurden:
    ls -la /var/run/visual-*.pid
    cat /var/run/visual-PKLS7_Z.pid
    
    1. Live-Logs des Skripts einsehen:
    sudo journalctl -f -u visual-starter.service
    

    Frag am besten nächstes Mal selber direkt eine KI... denn mein Gehirn braucht auch Energie und das Strg+C dauert länger als die Antwortgenerierung...

    Ich habe hier nur nach einer Woche geantwortet, damit deine Frage (die du vmtl. auch besser hättest stellen können...) nicht ohne eine Antwort untergeht.


Anmelden zum Antworten