VENV Script als Dienst

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
r4w
Beiträge: 6
Registriert: 06.09.2023 08:40:50

VENV Script als Dienst

Beitrag von r4w » 06.09.2023 08:47:38

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!

schwedenmann
Beiträge: 5529
Registriert: 30.12.2004 15:31:07
Wohnort: Wegberg

Re: VENV Script als Dienst

Beitrag von schwedenmann » 06.09.2023 08:59:17

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


tobo
Beiträge: 1997
Registriert: 10.12.2008 10:51:41

Re: VENV Script als Dienst

Beitrag von tobo » 06.09.2023 09:25:19

r4w hat geschrieben: ↑ zum Beitrag ↑
06.09.2023 08:47:38
Das Script läuft sozusagen im "Vordergrund" - wenn ich das Terminal schliesse beendet das Script.
Wenn du ein

Code: Alles auswählen

nohup ./script.py &
absetzt, dann bleibt das Skript erhalten, wenn du das Terminal schließt. Der Elternprozess geht, beim Schließen vom Terminal, dann auf den Init-Prozess (PID 1) über.
man nohup hat geschrieben: nohup - run a command immune to hangups, with output to a non-tty
Willst du den Output nohup.out noch weg haben, dann ginge sowas:

Code: Alles auswählen

nohup ./script.py >/dev/null 2>&1 &

Benutzeravatar
MSfree
Beiträge: 10777
Registriert: 25.09.2007 19:59:30

Re: VENV Script als Dienst

Beitrag von MSfree » 06.09.2023 09:35:52

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.

r4w
Beiträge: 6
Registriert: 06.09.2023 08:40:50

Re: VENV Script als Dienst

Beitrag von r4w » 06.09.2023 09:47:36

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:

Code: Alles auswählen

*/5 6-21 * * * /home/r4w/startDashboard.sh >> /home/r4w/dashboardLog.txt
Hier das sh Skript:

Code: Alles auswählen

#!/bin/bash
cd /home/r4w/SolarDashboard
source venv/bin/activate
python3 getSQLDataFromSolarAuswertung.py
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!)

schwedenmann
Beiträge: 5529
Registriert: 30.12.2004 15:31:07
Wohnort: Wegberg

Re: VENV Script als Dienst

Beitrag von schwedenmann » 06.09.2023 09:57:28

Hallo


Oder du startets das pythonscript alle 5 min
https://www.geeksforgeeks.org/python-sc ... 5-minutes/

mfg
schwedenmann

r4w
Beiträge: 6
Registriert: 06.09.2023 08:40:50

Re: VENV Script als Dienst

Beitrag von r4w » 06.09.2023 10:02:32

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.

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: VENV Script als Dienst

Beitrag von heisenberg » 06.09.2023 10:43:20

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:

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
Anschließend noch ...

Script aktivieren und starten:

Code: Alles auswählen

# systemctl daemon-reload
# systemctl enable meinpythonscript.service --now
Status des Dienstes anschauen:

Code: Alles auswählen

# systemctl status meinpythonscript
Log des Dienstes anschauen:

Code: Alles auswählen

# journalctl -u meinpythonscript --no-pager
Weitere Informationen zu den systemd-Units und deren Administration findest Du hier:
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.

rjh

Re: VENV Script als Dienst

Beitrag von rjh » 06.09.2023 10:47:37

heisenberg hat geschrieben: ↑ zum Beitrag ↑
06.09.2023 10:43:20
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.
Danke! :THX:

Mein Fehler. Hatte tatsächlich nur (reflexhaft?) auf das Stichwort "cron" hin mein Posting verfasst. 8O

r4w
Beiträge: 6
Registriert: 06.09.2023 08:40:50

Re: VENV Script als Dienst

Beitrag von r4w » 06.09.2023 11:07:44

heisenberg hat geschrieben: ↑ zum Beitrag ↑
06.09.2023 10:43:20
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:

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
Anschließend noch ...

Script aktivieren und starten:

Code: Alles auswählen

# systemctl daemon-reload
# systemctl enable meinpythonscript.service --now
Status des Dienstes anschauen:

Code: Alles auswählen

# systemctl status meinpythonscript
Log des Dienstes anschauen:

Code: Alles auswählen

# journalctl -u meinpythonscript --no-pager
Weitere Informationen zu den systemd-Units und deren Administration findest Du hier:
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.
Vielen lieben Dank bis hierhin, habe etwas gelernt und vorauss. auch die Lösung für meine Frage!

r4w
Beiträge: 6
Registriert: 06.09.2023 08:40:50

Re: VENV Script als Dienst

Beitrag von r4w » 06.09.2023 17:22:51

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:

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
Meine script.service sieht folgendermassen aus:

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
Als WorkingDirectory auch mit /home/r4w/SolarDashboard/venv probiert.

Benutzeravatar
heisenberg
Beiträge: 3567
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: VENV Script als Dienst

Beitrag von heisenberg » 06.09.2023 17:40:59

Das hier ...

Code: Alles auswählen

...
ExecStart=/home/r4w/SolarDashboard/getSQLDataFromSolarAuswertung.py
...
..., das sollte wohl eher so sein:

Code: Alles auswählen

...
ExecStart=/home/r4w/startDashboard.sh
...
...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...

Code: Alles auswählen

systemctl status ...
...
     Active: activating (auto-restart) (Result: exit-code) since Wed 2023-09-06 17:13:31 CEST; 2s ago
...
dann bedeutet das, dass der Dienst noch nicht erfolgreich gestartet wurde und man schaut am besten mal ins log mit ...

Code: Alles auswählen

journalctl -u solardashboard --no-pager --lines=30
Im Übrigen: Muss das Dingens wirklich als root laufen? Reicht da nicht der normale Benutzer r4w?
Jede Rohheit hat ihren Ursprung in einer Schwäche.

r4w
Beiträge: 6
Registriert: 06.09.2023 08:40:50

Re: VENV Script als Dienst

Beitrag von r4w » 07.09.2023 09:15:32

heisenberg hat geschrieben: ↑ zum Beitrag ↑
06.09.2023 17:40:59
Das hier ...

Code: Alles auswählen

...
ExecStart=/home/r4w/SolarDashboard/getSQLDataFromSolarAuswertung.py
...
..., das sollte wohl eher so sein:

Code: Alles auswählen

...
ExecStart=/home/r4w/startDashboard.sh
...
...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...

Code: Alles auswählen

systemctl status ...
...
     Active: activating (auto-restart) (Result: exit-code) since Wed 2023-09-06 17:13:31 CEST; 2s ago
...
dann bedeutet das, dass der Dienst noch nicht erfolgreich gestartet wurde und man schaut am besten mal ins log mit ...

Code: Alles auswählen

journalctl -u solardashboard --no-pager --lines=30
Im Übrigen: Muss das Dingens wirklich als root laufen? Reicht da nicht der normale Benutzer r4w?
Moin Heisenberg,

die Direktive

Code: Alles auswählen

ExecStart=/home/r4w/startDashboard.sh
hatte ich auch ausprobiert. Wie erwähnt startet das folgende Python-Script dann zwar erfolgreich, aber es startet mMn nicht neu. Denn die Daten, welche im Frontend bei erneuter Ausführung vorhanden sein müssten, sind es nicht. (in der DB jedoch vorhanden)
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'.
Leider reichen meine Kenntnisse nicht wirklich aus hier weitere Ansätze zu finden.. Ich hoffe auf Dein / Euer Fachwissen ;)

Antworten