matze31
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 788
|
Ich möchte mit ein shellscript ein python Script starten, und zwar wird per cronjob aller x Minuten ein bash Sript gestartet, dessen prüft, ob mein python Script läuft, wenn nicht soll es gestartet werden.
so weit so gut, das funzt auch,
| $(/usr/bin/python3 /home/Scripte/temperatur.py)
|
aber das bash Script läuft so lange, bis sich das Python Script beendet hat.
Genau das soll es nicht, denn ich möchte ja wieder Prüfen, ob das python script läuft, wenn nicht soll es wieder gestartet werden.
Wie kann ich das coden, dass sich das bash nach dem starten des python scriptes sofort beendet, auch wenn das python weiter läuft?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11260
Wohnort: München
|
Warum überlässt du die Prozesskontrolle nicht einfach dem Init-System (also systemd - Systemd/Units (Abschnitt „Eigene-Units-anlegen“))? Das kann u.a. Prozesse automatisch neu starten, wenn sie sich ungewollt beenden: https://www.freedesktop.org/software/systemd/man/systemd.service.html#Restart= Um auf die (hoffentlich überflüssig gewordene) Frage einzugehen: um Prozesse von der Shell zu entkoppeln gibt es nohup
|
matze31
(Themenstarter)
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 788
|
Naja es geht ja nicht darum, ob das python Script einfach beendet/abgebrochen wurde, sondern das Python Srcipt hat eine Aufgabe, wenn sie erledigt ist dann wird es (nach unbestimmter Zeit) beendet.
Es soll aber in bestimmten Abständen überprüft werden, ob das Script noch läuft, denn es macht ja keinen sinn ein Script zu starten was (noch) läuft.
Nehmen wir mal an ich möchte Stündlich prüfen bzw. das python Script starten.
Das Python script kann aber einen Zeitraum von 0 - ? laufen, bis es mit der Aufgabe fertig ist.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13204
|
matze31 schrieb: Naja es geht ja nicht darum, ob das python Script einfach beendet/abgebrochen wurde, sondern das Python Srcipt hat eine Aufgabe, wenn sie erledigt ist dann wird es (nach unbestimmter Zeit) beendet.
Es soll aber in bestimmten Abständen überprüft werden, ob das Script noch läuft, denn es macht ja keinen sinn ein Script zu starten was (noch) läuft.
Nehmen wir mal an ich möchte Stündlich prüfen bzw. das python Script starten.
Das Python script kann aber einen Zeitraum von 0 - ? laufen, bis es mit der Aufgabe fertig ist.
Genau das kannst Du robust und verlässlich mit Systemd erreichen. Da ist die Zeit, die Du darin investierst zu lernen, wie man Systemd-Unit und -Timer schreibt, besser angelegt.
|
matze31
(Themenstarter)
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 788
|
Vielen dank, ich werde mich da mal reinfuchsen. Edit: Nur noch eine Verständnisfrage, wenn ich ein Script mit Units starte, läuft dann die Units so lange mit, wie das (python) script läuft, oder schickt es nur das Script an und die Units beendet sich wieder?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11260
Wohnort: München
|
Wenn du es richtig machst, ist die Unit so lange aktiv wie der Prozess, den sie steuert. Und da eine Systemd/Timer Unit nur nicht-laufende Units startet, passt das sehr gut zum von dir gewollten Verhalten. Im Gegensatz zu cron bist du auch nicht an eine regelmäßige Ausführung eines Jobs (z.B. alle 60 Minuten) gebunden, sondern kannst wie in https://www.freedesktop.org/software/systemd/man/systemd.timer.html beschrieben z.B. auch festlegen, dass das Intervall erst ab dem Beenden der Unit (bzw. des davon gesteuerten Prozesses) laufen soll.
|
matze31
(Themenstarter)
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 788
|
Vielen Dank. Genau das habe ich gesucht.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13204
|
seahawk1986 schrieb: dass das Intervall erst ab dem Beenden der Unit (bzw. des davon gesteuerten Prozesses) laufen soll.
matze31 schrieb: Vielen Dank. Genau das habe ich gesucht.
Das führt natürlich dazu, dass man kein gleichmäßiges Zeitmuster erhält, weil die Prozesse ja unterschiedlich lange laufen können. Keine Ahnung, ob das für Deinen Fall ein Problem ist.
|
matze31
(Themenstarter)
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 788
|
rklm Das führt natürlich dazu, dass man kein gleichmäßiges Zeitmuster erhält, weil die Prozesse ja unterschiedlich lange laufen können. Keine Ahnung, ob das für Deinen Fall ein Problem ist.
Alles gut, das passt schon.
|
matze31
(Themenstarter)
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 788
|
Nach vielen testen habe ich (fast) alles hinbekommen mit timer und so ... -tolle Sache- Aber was mich jetzt noch stutzig macht ist, das diese Unit doch eigentlich beim start ausgeführt werden müsste oder? [Unit]
Description=kamera
[Service]
ExecStart=/home/pi/cam.py
[Install]
WantedBy=reboot.target Es soll gleich nach Neustart das Script starten.
Wenn ich den service manuell starte, dann läuft das Script.
Auch zeigt es mir an das es aktiv ist 😕 pi@raspberrypi:~ $ sudo systemctl is-enabled cam.service
enabled
Oder wird es "zu schnell" für Python ausgeführt, dass Python noch gar nicht aktiv ist?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13204
|
matze31 schrieb:
[Unit]
Description=kamera
[Service]
ExecStart=/home/pi/cam.py
[Install]
WantedBy=reboot.target Es soll gleich nach Neustart das Script starten.
Ich bin nicht der Systemd-Held, aber ich glaube, Du hast da ein falsches Target gewählt; wenn ich das richtig sehe, zieht das nur beim Reboot - also bevor der Rechner wieder hochkommt. Wenn es beim Start ausgeführt werden soll, dann ist multi-user.target vermutlich besser.
Oder wird es "zu schnell" für Python ausgeführt, dass Python noch gar nicht aktiv ist?
Python ist dann aktiv, wenn das Programm gestartet wird. Da gibt es nix, auf das man warten muss.
|
matze31
(Themenstarter)
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 788
|
Bei 'multi-user.target' keine Besserung.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11260
Wohnort: München
|
Genau, das WantedBy=reboot.target passt nicht. Wenn das Skript keine sonstigen Abhängigkeiten (z.B. zu einer bestehenden Netzwerkverbindung) hat, sollte es genügen WantedBy=multi-user.target zu setzen und die Unit nach einem systemctl daemon-reload erneut zu aktivieren.
|
matze31
(Themenstarter)
Anmeldungsdatum: 25. Oktober 2015
Beiträge: 788
|
@seahawk1986
Leider funktioniert das auch nicht.
Wenn ich es manuell starte dann funzt es.
sudo systemctl start cam.service
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11260
Wohnort: München
|
Was sagt denn
systemctl status cam.service nach einem Neustart?
|