Hoe python script constant laten draaien op pi

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • hankee
  • Registratie: Februari 2009
  • Laatst online: 02-07 16:28
Ik haal gegevens van mijn Fibaro op via een python scriptje op een Raspberry Pi (met Raspberry Pi OS) en die informatie wordt naar InfluxDB op mijn nas gestuurd. Hiervoor heb ik een cronjob aangemaakt die elke 10 minuten deze taak uitvoert en dat werkt goed.

Nu heb ik ook een P1 kabel gekocht en doe ik hetzelfde met de informatie uit de slimme meter, daarvoor gebruik ik dit script https://github.com/psy0rz/p1_dsmr_to_influxdb

Als ik in PuTTY dit script start dmv sudo python3 p1_to_influxdb.py gaat dit draaien en wordt elke seconde (?) automatisch alle informatie naar InfluxDB gestuurd. Het script blijft echter draaien in PuTTY en herhaalt zichzelf. Ik zie in PuTTY alle opgehaalde informatie elke seconde voorbij komen.

Alleen als ik PuTTY sluit stopt ook het script met draaien en worden de gegevens niet meer opgehaald. Pas als ik het script weer handmatig start gaat het weer draaien.

Ik heb geprobeerd het script te starten met dmv een cronjob maar dit werkt niet zoals bij de informatie uit de Fibaro, ik krijg geen data in influxdb.

Het is voor mij allemaal nieuw terrein maar meestal krijg ik het het met wat googlen en uitproberen wel aan de praat. In dit geval weet ik alleen niet hoe ik het op moet lossen en ik krijg het ook niet online gevonden.

Hoe kan dit script blijven draaien op de Pi terwijl PuTTY afgesloten is?

Beste antwoord (via hankee op 23-08-2020 16:17)


  • .Kaas
  • Registratie: Juni 2008
  • Laatst online: 13-07 17:17
hankee schreef op zondag 23 augustus 2020 @ 14:37:
[...]

Het lastige is dat ik niet weet waar ik naar opzoek ben. :) Hoe heet hetgeen wat ik wil?
Hij bedoelt supervisord, een python projectje om process management te doen.
http://supervisord.org/

Als je liever iets wilt gebruiken wat al beschikbaar is vanuit het besturingssysteem, zou ik jouw script registeren in systemd als service. Dit kun je doen door middel van een unit file. Als je vervolgens de service "enabled", wordt het ook na reboots weer keurig gestart.

Voorbeeldje:

sudo vim /lib/systemd/system/myservice.service:

code:
1
2
3
4
5
6
7
8
9
[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /home/henk/test_service.sh

[Install]
WantedBy=multi-user.target


code:
1
2
systemctl daemon-reload
systemctl enable --now myservice

[ Voor 4% gewijzigd door .Kaas op 23-08-2020 14:45 ]

Alle reacties


Acties:
  • +1 Henk 'm!

  • prein2
  • Registratie: Februari 2007
  • Nu online

prein2

2.430 kWp, Solaredge SE2200

Je kunt het starten met het programma supervisor. Dat start ie ook nog eens automatisch opnieuw als het een keer fout gaat.

Wat je ook kunt doen is putty ‘hard’ afsluiten (kruisje), dan blijft ie ook lopen

PVoutput


Acties:
  • +5 Henk 'm!

  • borft
  • Registratie: Januari 2002
  • Laatst online: 22-09 15:34
of je kunt het script in een "screen" draaien. of opstarten in de background met nohup. Het kan echter zijn dat het script een terminal nodig heeft, in dat geval is screen de beste oplossing.

Acties:
  • 0 Henk 'm!

  • hankee
  • Registratie: Februari 2009
  • Laatst online: 02-07 16:28
prein2 schreef op zondag 23 augustus 2020 @ 14:33:
Je kunt het starten met het programma supervisor. Dat start ie ook nog eens automatisch opnieuw als het een keer fout gaat.

Wat je ook kunt doen is putty ‘hard’ afsluiten (kruisje), dan blijft ie ook lopen
Als ik 'hard afsluit' dan vraagt ie of ik de sessie wil beëindigen en het script stopt dan ook per direct. Ik krijg dan ook gelijk geen data meer binnen. Ik ga supervisor bekijken.

Het lastige is dat ik niet weet waar ik naar opzoek ben. :) Hoe heet hetgeen wat ik wil?

Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 22-09 17:24

DataGhost

iPL dev

prein2 schreef op zondag 23 augustus 2020 @ 14:33:
Wat je ook kunt doen is putty ‘hard’ afsluiten (kruisje), dan blijft ie ook lopen
Hoe zou dat werken dan? Er is weinig verschil tussen netjes uitloggen, het kruisje gebruiken of zelfs het proces killen. Als het niet direct/netjes gebeurt wordt de SSH-verbinding uiteindelijk een keer verbroken. Op het moment dat de server dat doorkrijgt gaan gewoon alle draaiende processen in die sessie kapot. Je script moet echt goed wegforken om te mogen blijven draaien. Anders zit je binnen de kortste keren met duizenden processen van "hard afgesloten" sessies.

@hankee Het netste is er een (systemd) service van te maken, dan wordt ook het automatisch starten en eventueel restarten geregeld. Tweede keuze zou ik inderdaad screen aanraden zoals @borft al zegt.

[ Voor 12% gewijzigd door DataGhost op 23-08-2020 14:40 ]


Acties:
  • 0 Henk 'm!

  • borft
  • Registratie: Januari 2002
  • Laatst online: 22-09 15:34
hankee schreef op zondag 23 augustus 2020 @ 14:37:
[...]


Als ik 'hard afsluit' dan vraagt ie of ik de sessie wil beëindigen en het script stopt dan ook per direct. Ik krijg dan ook gelijk geen data meer binnen. Ik ga supervisor bekijken.

Het lastige is dat ik niet weet waar ik naar opzoek ben. :) Hoe heet hetgeen wat ik wil?
ik denk dat het magische zoek woord "supervisord" is ;) een andere oplossing is circusd (beide programma's kunnen een script als daemon/service draaien in de achtergrond)

[ Voor 11% gewijzigd door borft op 23-08-2020 14:42 ]


Acties:
  • 0 Henk 'm!

  • jeroen3
  • Registratie: Mei 2010
  • Laatst online: 06:29

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • .Kaas
  • Registratie: Juni 2008
  • Laatst online: 13-07 17:17
hankee schreef op zondag 23 augustus 2020 @ 14:37:
[...]

Het lastige is dat ik niet weet waar ik naar opzoek ben. :) Hoe heet hetgeen wat ik wil?
Hij bedoelt supervisord, een python projectje om process management te doen.
http://supervisord.org/

Als je liever iets wilt gebruiken wat al beschikbaar is vanuit het besturingssysteem, zou ik jouw script registeren in systemd als service. Dit kun je doen door middel van een unit file. Als je vervolgens de service "enabled", wordt het ook na reboots weer keurig gestart.

Voorbeeldje:

sudo vim /lib/systemd/system/myservice.service:

code:
1
2
3
4
5
6
7
8
9
[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /home/henk/test_service.sh

[Install]
WantedBy=multi-user.target


code:
1
2
systemctl daemon-reload
systemctl enable --now myservice

[ Voor 4% gewijzigd door .Kaas op 23-08-2020 14:45 ]


Acties:
  • 0 Henk 'm!

  • hankee
  • Registratie: Februari 2009
  • Laatst online: 02-07 16:28
@DataGhost & @.Kaas Ik heb een service gemaakt:

[Unit]
Description=P1 to Influxdb
After=network.target

[Service]
ExecStart=/usr/bin/python3 -u p1_to_influxdb.py
WorkingDirectory=/home/pi/slimmemeter
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

Ik heb deze service p1-influx.service genoemd en aangemaakt in /etc/systemd/system (ik zie dat de hulp pagina van Raspberry Pi een ander pad aangeeft dan .Kaas

Het vreemde nu is dat als ik hem start met sudo systemctl start p1-influx.service er wel iets van data binnenkomt maar niet alles, er lijkt iets mis te gaan. Ook als ik alle services bekijk met systemctl list-unit-files | grep p1 staat hij op disabled.

Helaas weet ik niet hoe ik nu kan kijken wat er mis gaat met het script, ik kan niet zien welke data er wel/ niet verstuurd wordt.

Acties:
  • 0 Henk 'm!

  • .Kaas
  • Registratie: Juni 2008
  • Laatst online: 13-07 17:17
Je kunt de status van de service bekijken met

code:
1
sudo systemctl status p1-influx.service


Logging waarschijnlijk met
code:
1
sudo journalctl -u p1-influx.service

Acties:
  • +1 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 22-09 17:24

DataGhost

iPL dev

Dan zal je toch in je logs moeten kijken wat er (niet) gebeurt. Wat mij wel opvalt is dat je in je topicstart je script start met sudo en in je service User=pi hebt staan. Als je script daadwerkelijk root-rechten nodig heeft zal het daarop stuklopen, dus dan moet je even de user veranderen.

Acties:
  • +1 Henk 'm!

  • hankee
  • Registratie: Februari 2009
  • Laatst online: 02-07 16:28
.Kaas schreef op zondag 23 augustus 2020 @ 14:43:
[...]


Hij bedoelt supervisord, een python projectje om process management te doen.
http://supervisord.org/

Als je liever iets wilt gebruiken wat al beschikbaar is vanuit het besturingssysteem, zou ik jouw script registeren in systemd als service. Dit kun je doen door middel van een unit file. Als je vervolgens de service "enabled", wordt het ook na reboots weer keurig gestart.

Voorbeeldje:

sudo vim /lib/systemd/system/myservice.service:

code:
1
2
3
4
5
6
7
8
9
[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /home/henk/test_service.sh

[Install]
WantedBy=multi-user.target


code:
1
2
systemctl daemon-reload
systemctl enable --now myservice
Had meteen moeten luisteren ;) heb nu jou scriptje gebruikt ipv de RPI documentatie en nu loopt het als een zonnetje.

[Unit]
Description=P1 to Influx

[Service]
Type=simple
ExecStart=sudo python3 /home/pi/slimmemeter/p1_to_influxdb.py

[Install]
WantedBy=multi-user.target

Ben alleen nog wel benieuwd wat het verschil is tussen
/lib/systemd/system/ zoals jij adviseert
en
/etc/systemd/system/ zoals de documentatie adviseert,

Acties:
  • 0 Henk 'm!

  • hankee
  • Registratie: Februari 2009
  • Laatst online: 02-07 16:28
OK al gevonden:
Basically, files that ships in packages downloaded from distribution repository go into /usr/lib/systemd/. Modifications done by system administrator (user) go into /etc/systemd/system/.

System-specific units override units supplied by vendors. Using drop-ins, you can override only specific parts of unit files, leaving the rest to vendor (drop-ins are available since the very beginning of systemd, but were properly documented only in v219; see man systemd.unit).

Acties:
  • 0 Henk 'm!

  • hankee
  • Registratie: Februari 2009
  • Laatst online: 02-07 16:28
DataGhost schreef op zondag 23 augustus 2020 @ 15:23:
Dan zal je toch in je logs moeten kijken wat er (niet) gebeurt. Wat mij wel opvalt is dat je in je topicstart je script start met sudo en in je service User=pi hebt staan. Als je script daadwerkelijk root-rechten nodig heeft zal het daarop stuklopen, dus dan moet je even de user veranderen.
Heb de user eruit gehaald en nu werkt het :) Weet niet of het nu allemaal precies werkt zoals het hoort maar ik ben er blij mee.

Acties:
  • 0 Henk 'm!

  • borft
  • Registratie: Januari 2002
  • Laatst online: 22-09 15:34
Hmm, is het echt nodig dat het scriptje als root draait? Waarschijnlijk kan je het als een simpele user draaien, en die in de "dialout" group stoppen (als je van de seriele port wilt lezen).
Pagina: 1