VENV Script als Dienst
VENV Script als Dienst
Hallo miteinander,
bin aktuell dabei Daten meines Balkonkraftwerks über Plotly darzustellen.
Die Daten laufen in eine SQLite DB und werden über ein Python Script ausgelesen und mit Plotly visualisiert.
Soweit funktioniert das schonmal.
Ich habe Plotly lt. Tutorial in einer Virtuellen Umgebung (venv) eingerichtet, in dieser sich auch das Python Script befindet.
Das Starten klappt wunderbar, allerdings nur manuell über das Terminal. Das Script läuft sozusagen im "Vordergrund" - wenn ich das Terminal schliesse beendet das Script.
Meine Überlegung war das Script als Dienst starten zu lassen, sodass es im Hintergrund läuft und auch nicht manuell gestartet werden muss.
Das ist die Stelle, an der meine Linux Fähigkeiten hart an Ihre Grenzen kommen.
Bin ich mit dem Dienst generell auf dem richtigen Weg oder übersehe ich was?
Und wie kann ich das Script auf dem venv-Kontext als Dienst einrichten?
Danke schonmal für eure Hilfe!
bin aktuell dabei Daten meines Balkonkraftwerks über Plotly darzustellen.
Die Daten laufen in eine SQLite DB und werden über ein Python Script ausgelesen und mit Plotly visualisiert.
Soweit funktioniert das schonmal.
Ich habe Plotly lt. Tutorial in einer Virtuellen Umgebung (venv) eingerichtet, in dieser sich auch das Python Script befindet.
Das Starten klappt wunderbar, allerdings nur manuell über das Terminal. Das Script läuft sozusagen im "Vordergrund" - wenn ich das Terminal schliesse beendet das Script.
Meine Überlegung war das Script als Dienst starten zu lassen, sodass es im Hintergrund läuft und auch nicht manuell gestartet werden muss.
Das ist die Stelle, an der meine Linux Fähigkeiten hart an Ihre Grenzen kommen.
Bin ich mit dem Dienst generell auf dem richtigen Weg oder übersehe ich was?
Und wie kann ich das Script auf dem venv-Kontext als Dienst einrichten?
Danke schonmal für eure Hilfe!
-
- Beiträge: 5535
- Registriert: 30.12.2004 15:31:07
- Wohnort: Wegberg
Re: VENV Script als Dienst
Hallo
Ich würdeden Startbefehl in ein Script schreiben,das Script ausführbar machen und nach /etc/cron.daily kopieren. Wenn du jetzt afaik noch anacron installierst sollte das script jeden Tag beim booten gestertet werden.
mfg
schwedenmann
Ich würdeden Startbefehl in ein Script schreiben,das Script ausführbar machen und nach /etc/cron.daily kopieren. Wenn du jetzt afaik noch anacron installierst sollte das script jeden Tag beim booten gestertet werden.
mfg
schwedenmann
Re: VENV Script als Dienst
Wenn du einr4w hat geschrieben:06.09.2023 08:47:38Das Script läuft sozusagen im "Vordergrund" - wenn ich das Terminal schliesse beendet das Script.
Code: Alles auswählen
nohup ./script.py &
Willst du den Output nohup.out noch weg haben, dann ginge sowas:man nohup hat geschrieben: nohup - run a command immune to hangups, with output to a non-tty
Code: Alles auswählen
nohup ./script.py >/dev/null 2>&1 &
Re: VENV Script als Dienst
Zuerst sollte man klären, ob das überhaupt ein Dienst ist oder ob es sich um eine periodische Aufgabe handelt.
Dienste startet man mit einem systemd-Unit
Periodische Aufgaben startet man mit cron oder mit einem systemd-Timer.
Dienste startet man mit einem systemd-Unit
Periodische Aufgaben startet man mit cron oder mit einem systemd-Timer.
Re: VENV Script als Dienst
Die Idee über Crontab hatte ich auch, wusste nicht dass es auch mit venv funktioniert! Danke!
Crontab enthält nun die Anweisung das Script alle 5 Minuten zu starten:
Hier das sh Skript:
Der Cronjob läuft nun alle 5 Minuten, das kann ich im Log sehen.
Das Python Script startet sich wohl nicht neu, denn die Daten die es liefern sollte sind nicht aktuell sondern auf dem Stand der allerersten Ausführung des Skripts.
Wie kann ich das lösen?
(Die anderen Tipps sind auch hilfreich, wieder was gelernt - Vielen Dank hierfür!)
Crontab enthält nun die Anweisung das Script alle 5 Minuten zu starten:
Code: Alles auswählen
*/5 6-21 * * * /home/r4w/startDashboard.sh >> /home/r4w/dashboardLog.txt
Code: Alles auswählen
#!/bin/bash
cd /home/r4w/SolarDashboard
source venv/bin/activate
python3 getSQLDataFromSolarAuswertung.py
Das Python Script startet sich wohl nicht neu, denn die Daten die es liefern sollte sind nicht aktuell sondern auf dem Stand der allerersten Ausführung des Skripts.
Wie kann ich das lösen?
(Die anderen Tipps sind auch hilfreich, wieder was gelernt - Vielen Dank hierfür!)
-
- Beiträge: 5535
- Registriert: 30.12.2004 15:31:07
- Wohnort: Wegberg
Re: VENV Script als Dienst
Hallo
Oder du startets das pythonscript alle 5 min
https://www.geeksforgeeks.org/python-sc ... 5-minutes/
mfg
schwedenmann
Oder du startets das pythonscript alle 5 min
https://www.geeksforgeeks.org/python-sc ... 5-minutes/
mfg
schwedenmann
Re: VENV Script als Dienst
Das Pythonscript muss ja im Kontext der virtuellen Umgebung gestartet werden.
Das wird im Shellscript gemacht. Daher hilft mir das nicht weiter denke ich...
Weiss leider nicht wie das im Crontab genau arbeitet, ob das Script beim erneuten ausführen alle 5 Minuten vorher beendet werden kann (evtl. über nen Parameter in Crontab?)..
Jedenfalls müsste das Script alle 5min beendet und neu gestartet werden.
Das wird im Shellscript gemacht. Daher hilft mir das nicht weiter denke ich...
Weiss leider nicht wie das im Crontab genau arbeitet, ob das Script beim erneuten ausführen alle 5 Minuten vorher beendet werden kann (evtl. über nen Parameter in Crontab?)..
Jedenfalls müsste das Script alle 5min beendet und neu gestartet werden.
- heisenberg
- Beiträge: 3592
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: VENV Script als Dienst
Also so grundsätzlich hat r4w nach einer Ausführung als "Dienst" gefragt und als Antwort "cron" bzw "systemd-timer" bekommen. Die letzte Antwort zeigt, dass "Dienst" hier wohl tatsächlich das passendere ist.
@r4w:
Du kannst das Script auch direkt als systemd-service laufen lassen. Hier mal ein Beispiel einer einfachen systemd unit Datei, deren Name /etc/systemd/system/meinpythonscript.service sein soll:
Anschließend noch ...
Script aktivieren und starten:
Status des Dienstes anschauen:
Log des Dienstes anschauen:
Weitere Informationen zu den systemd-Units und deren Administration findest Du hier:
@r4w:
Du kannst das Script auch direkt als systemd-service laufen lassen. Hier mal ein Beispiel einer einfachen systemd unit Datei, deren Name /etc/systemd/system/meinpythonscript.service sein soll:
Code: Alles auswählen
[Unit]
Description=Mein tolles Script
After=network-online.target
[Service]
Type=simple
Restart=always
RestartSec=5
User=MeinUser
WorkingDirectory=/home/MeinUser
ExecStart=/home/MeinUser/bin/MeinScript
[Install]
WantedBy=multi-user.target
Script aktivieren und starten:
Code: Alles auswählen
# systemctl daemon-reload
# systemctl enable meinpythonscript.service --now
Code: Alles auswählen
# systemctl status meinpythonscript
Code: Alles auswählen
# journalctl -u meinpythonscript --no-pager
- https://wiki.ubuntuusers.de/systemd/Units/
- https://wiki.ubuntuusers.de/systemd/Service_Units/
- https://wiki.ubuntuusers.de/systemd/systemctl/
- Aufbau von Unit-Service-Dateien (Englisch) : https://www.freedesktop.org/software/sy ... rvice.html
Zuletzt geändert von heisenberg am 06.09.2023 11:02:02, insgesamt 5-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.
Re: VENV Script als Dienst
Danke!heisenberg hat geschrieben:06.09.2023 10:43:20Also so grundsätzlich hat r4w nach einer Ausführung als "Dienst" gefragt und als Antwort "cron" bzw "systemd-timer" bekommen. Die letzte Antwort zeigt, dass "Dienst" hier wohl tatsächlich das passendere ist.
Mein Fehler. Hatte tatsächlich nur (reflexhaft?) auf das Stichwort "cron" hin mein Posting verfasst.
Re: VENV Script als Dienst
Danke für deine ausführliche Antwort Ja tatsächlich nach Äpfeln gefragt und Birnen bekommen .. wobei der Zweck für mich im Vordergrund steht, also wenns mit Cronjob gut ginge, wäre ich voll zufrieden gewesen. Muss gleich leider los, sodass ich es mit deiner Lösung nicht direkt probieren kann sondern erst morgen vorauss.heisenberg hat geschrieben:06.09.2023 10:43:20Also so grundsätzlich hat r4w nach einer Ausführung als "Dienst" gefragt und als Antwort "cron" bzw "systemd-timer" bekommen. Die letzte Antwort zeigt, dass "Dienst" hier wohl tatsächlich das passendere ist.
@r4w:
Du kannst das Script auch direkt als systemd-service laufen lassen. Hier mal ein Beispiel einer einfachen systemd unit Datei, deren Name /etc/systemd/system/meinpythonscript.service sein soll:
Anschließend noch ...Code: Alles auswählen
[Unit] Description=Mein tolles Script After=network-online.target [Service] Type=simple Restart=always RestartSec=5 User=MeinUser WorkingDirectory=/home/MeinUser ExecStart=/home/MeinUser/bin/MeinScript [Install] WantedBy=multi-user.target
Script aktivieren und starten:
Status des Dienstes anschauen:Code: Alles auswählen
# systemctl daemon-reload # systemctl enable meinpythonscript.service --now
Log des Dienstes anschauen:Code: Alles auswählen
# systemctl status meinpythonscript
Weitere Informationen zu den systemd-Units und deren Administration findest Du hier:Code: Alles auswählen
# journalctl -u meinpythonscript --no-pager
- https://wiki.ubuntuusers.de/systemd/Units/
- https://wiki.ubuntuusers.de/systemd/Service_Units/
- https://wiki.ubuntuusers.de/systemd/systemctl/
- Aufbau von Unit-Service-Dateien (Englisch) : https://www.freedesktop.org/software/sy ... rvice.html
Vielen lieben Dank bis hierhin, habe etwas gelernt und vorauss. auch die Lösung für meine Frage!
Re: VENV Script als Dienst
Habe deine Lösung mal probiert, leider komme ich nicht weiter.
1) Wenn ich das Shellscript, welches die VENV aktiviert und dann das Pythonscript startet als Dienst einrichte, läuft zwar der Dienst, jedoch aktualisiert sich das Pythonscript dann genauso wenig.
2) Wenn ich die das Pythonscript direkt als Dienst starte, erhalte ich Fehlermeldungen.
Journalctl sagt:
Meine script.service sieht folgendermassen aus:
Als WorkingDirectory auch mit /home/r4w/SolarDashboard/venv probiert.
1) Wenn ich das Shellscript, welches die VENV aktiviert und dann das Pythonscript startet als Dienst einrichte, läuft zwar der Dienst, jedoch aktualisiert sich das Pythonscript dann genauso wenig.
2) Wenn ich die das Pythonscript direkt als Dienst starte, erhalte ich Fehlermeldungen.
Journalctl sagt:
Code: Alles auswählen
● solardashboard.service - Solar Dashboard Aufbereiten und darstellen
Loaded: loaded (/etc/systemd/system/solardashboard.service; enabled; preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Wed 2023-09-06 17:13:31 CEST; 2s ago
Process: 4218 ExecStart=/home/r4w/SolarDashboard/getSQLDataFromSolarAuswertung.py (code=exited, status=203/EXEC)
Main PID: 4218 (code=exited, status=203/EXEC)
CPU: 3ms
Code: Alles auswählen
[Unit]
Description=Solar Dashboard aufbereiten und darstellen
After=network-online.target
[Service]
Type=simple
Restart=always
RestartSec=30
User=root
WorkingDirectory=/home/r4w/SolarDashboard
ExecStart=/home/r4w/SolarDashboard/getSQLDataFromSolarAuswertung.py
[Install]
WantedBy=multi-user.target
- heisenberg
- Beiträge: 3592
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: VENV Script als Dienst
Das hier ...
..., das sollte wohl eher so sein:
...weil Du in startDashboard.sh ja noch Variablen aus einer Datei einliest. Ohne die wird Dein Python-Script wahrscheinlich nicht glücklich sein. Das kann man im .service File auch noch per EnvironmentFile - Direktive einbinden, dann kann das Shell-Script drumherum weg.
Und wenn der Status so ist...
dann bedeutet das, dass der Dienst noch nicht erfolgreich gestartet wurde und man schaut am besten mal ins log mit ...
Im Übrigen: Muss das Dingens wirklich als root laufen? Reicht da nicht der normale Benutzer r4w?
Code: Alles auswählen
...
ExecStart=/home/r4w/SolarDashboard/getSQLDataFromSolarAuswertung.py
...
Code: Alles auswählen
...
ExecStart=/home/r4w/startDashboard.sh
...
Und wenn der Status so ist...
Code: Alles auswählen
systemctl status ...
...
Active: activating (auto-restart) (Result: exit-code) since Wed 2023-09-06 17:13:31 CEST; 2s ago
...
Code: Alles auswählen
journalctl -u solardashboard --no-pager --lines=30
Jede Rohheit hat ihren Ursprung in einer Schwäche.
Re: VENV Script als Dienst
Moin Heisenberg,heisenberg hat geschrieben:06.09.2023 17:40:59Das hier ......, das sollte wohl eher so sein:Code: Alles auswählen
... ExecStart=/home/r4w/SolarDashboard/getSQLDataFromSolarAuswertung.py ...
...weil Du in startDashboard.sh ja noch Variablen aus einer Datei einliest. Ohne die wird Dein Python-Script wahrscheinlich nicht glücklich sein. Das kann man im .service File auch noch per EnvironmentFile - Direktive einbinden, dann kann das Shell-Script drumherum weg.Code: Alles auswählen
... ExecStart=/home/r4w/startDashboard.sh ...
Und wenn der Status so ist...
dann bedeutet das, dass der Dienst noch nicht erfolgreich gestartet wurde und man schaut am besten mal ins log mit ...Code: Alles auswählen
systemctl status ... ... Active: activating (auto-restart) (Result: exit-code) since Wed 2023-09-06 17:13:31 CEST; 2s ago ...
Im Übrigen: Muss das Dingens wirklich als root laufen? Reicht da nicht der normale Benutzer r4w?Code: Alles auswählen
journalctl -u solardashboard --no-pager --lines=30
die Direktive
Code: Alles auswählen
ExecStart=/home/r4w/startDashboard.sh
Also selbes Verhalten, als ob ich das .sh Script manuell starte.
Das Log zum Dienst sagt, Exec format Error, Status 203
Code: Alles auswählen
Sep 07 08:36:08 PiHole (rtung.py)[13618]: solardashboard.service: Failed at step EXEC spawning /home/r4w/SolarDashboard/getSQLDataFromSolarAuswertung.py: Exec format error
Sep 07 08:36:08 PiHole systemd[1]: solardashboard.service: Main process exited, code=exited, status=203/EXEC
Sep 07 08:36:08 PiHole systemd[1]: solardashboard.service: Failed with result 'exit-code'.