A
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.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
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.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:
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@KE
Bei 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.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.