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 doneDanke
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.
- 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- 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.serviceHinweis: 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- 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- Dienst aktivieren:
sudo chmod +x /usr/local/bin/visual-starter.sh sudo systemctl daemon-reload sudo systemctl enable --now visual-starter.serviceFazit & 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:
- 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- Gesamtübersicht aller Instanzen prüfen:
sudo systemctl list-units "visual-prog@*"- Live-Logs der Programme einsehen:
sudo journalctl -f -u visual-prog@Z -u visual-prog@T1 -u visual-prog@KEBei Option 2 (Bash-Skript):
- Status des Haupt-Dienstes prüfen:
sudo systemctl status visual-starter.service- Prüfen, ob die Hintergrundprozesse wirklich laufen:
ps aux | grep -E "PKLS7|visual-starter"- Prüfen, ob PID-Dateien angelegt wurden:
ls -la /var/run/visual-*.pid cat /var/run/visual-PKLS7_Z.pid- Live-Logs des Skripts einsehen:
sudo journalctl -f -u visual-starter.serviceFrag 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.