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.
-
Damit du hier nicht mit einer KI-Antwort alleine gelassen wirst: Das Problem ist deine Frage. Ich wollte dir ernsthaft antworten, aber ich konnte wirklich nicht verstehen, was du überhaupt warum genau erreichen willst, und was dein Problem dabei ist. "funktionieren nicht" ist keine ausreichende Problembeschreibung. Wir können nicht in deinen Kopf gucken. Ansonsten bekommst du nur so Einheitsbrei wie in dem Beitrag hier drüber, wie man Daemons in Debian allgemein erstellt. Kann sein, dass es das war, was du wissen wolltest, aber dann hättest du kaum die Frage so gestellt.
-
@SeppJ sagte in Startdaemon unter Debian erstellen:
KI-Antwort
Das war eine Hybrid-KI-Antwort... ich habe nacheditiert. Genau lesen?
-
Vielen Dank,
ja, ich sehe die Vorteile ein und werde es mit systemd-dienst machen.
Nochmals vielen Dank.
PS: KI generiert nur eine Antwort auf meine Frage, Erfahrung generiert eine Antwort auch leicht abgewichen von der Frage. Daher werte ich eine Antwort mit/durch Erfahrung mehr.
-
Was, wenn jemand Erfahrung hat, aber keine Lust hat, selber eine Antwort zu formulieren, obwohl er es womöglich könnte? Wie wird das gewertet?
-
@Anon-81275 sagte in Startdaemon unter Debian erstellen:
Was, wenn jemand Erfahrung hat, aber keine Lust hat, selber eine Antwort zu formulieren
Dann soll er es lassen
-
@Belli sagte in Startdaemon unter Debian erstellen:
Dann soll er es lassen
Im Ergebnis hat der Fragesteller dann gar keine Antwort...
-
@Anon-81275
Wieso? Die KI, deren Antwort der Erfahrene posten würde, der keine Lust hat, selbst eine Antwort zu formulieren, kann der Fragesteller auch selbst konsultieren.
-
@Belli Hat er aber nicht... oder habe ich etwas verpasst?
-
@Anon-81275 sagte in Startdaemon unter Debian erstellen:
@Belli Hat er aber nicht... oder habe ich etwas verpasst?
Und das impliziert, dass er so eine Antwort nicht möchte.
-
@SeppJ
Dann drehen wir uns im Kreis, erfahrene Antworten unterscheiden sich nicht mehr von KI-Antworten... Aber ist mir egal, macht jeder, was er möchte.
-
... Es gibt u. a. ein tui-Tool, um die Handhabung von systemd-Diensten zu vereinfachen:
https://github.com/matheus-git/systemd-manager-tui
Habe es gerade mal gestartet, das Systemd-Dienst-Skript müsstest du zwar noch selber anlegen, aber danach ist die Verwaltung und Kontrolle des Diensts relativ einfach.
Für die Installation muss einfach nur das bin file aus den Releases heruntergeladen werden...
mkdir tui cd tui wget https://github.com/matheus-git/systemd-manager-tui/releases/download/ANPASSEN/systemd-manager-tui chmod +x systemd-manager-tui ./systemd-manager-tuiAnschließend werden alle verfügbaren Commands jeweils unten angezeigt. Sei aber bitte vorsichtig, normalerweise muss man die Systemd-Dienste nie manuell anfassen.
-
Dieser Beitrag wurde gelöscht!
-
@AntjeSikken sagte in Startdaemon unter Debian erstellen:
Gerade bei technischen Problemen habe ich auch schon oft erlebt, dass eine theoretisch völlig richtige Lösung in der Praxis noch einen kleinen Haken hat.
Auf die (Edge Cases, Pitfalls, "das, was nicht im Handbuch steht", ...) weist AI mittlerweile hin. Ich verstehe die pauschale Kritik nicht. Mitunter sind die Fragen von @worst_case auch nicht gut formuliert.
Linux hat gesagt, AI dürfe im Kernel-Code eingesetzt werden, und Torvalds hat gesagt, wer dies nicht möchte, kann gehen... Ich denke, noch eindeutiger geht es kaum. Oder liegen die etwa alle falsch?
https://www.linux-magazin.de/news/klarstellung-linus-torvalds-erlaubt-ki-bei-kernel-entwicklung/
https://www.heise.de/news/Debian-erlaubt-KI-Beitraege-ohne-Kennzeichnungspflicht-11435420.html