Seite 1 von 1
Script startet nicht als Dienst unter Linux
Verfasst: Donnerstag 9. September 2021, 16:28
von WuChenFu
Hi,
ich habe ein Python Script geschrieben das läuft problemlos, wenn ich es von der Console aufrufe.
Starte ich das ganze als Dienst, läuft es auch zunächst problemlos - keine Fehlermeldung.
Aktiviere ich einen Button am Raspberry, erhalte ich folgende Meldungen im
.
Code: Alles auswählen
Sep 09 17:18:17 raspberrypi python[14454]: terminate called after throwing an instance of 'std::logic_error'
Sep 09 17:18:17 raspberrypi python[14454]: what(): basic_string::_M_construct null not valid
Wie gesagt, nur via Console läuft das Script ohne Probleme und macht was es soll.
Was soll bzw tut es, wenn es läuft?
Ist ein Script für eine Türsprechanlage das via Twinkle Verbindungen herstellt.
Hat jemand ne Idee?
Ich finde da nix zu.
Re: Script startet nicht als Dienst unter Linux
Verfasst: Donnerstag 9. September 2021, 17:29
von __deets__
Ohne das Skript aussehen: nein. Denn das ist ein C++ Fehler, und der kommt denke ich aus einer uns noch unbekannten Bibliothek.
Re: Script startet nicht als Dienst unter Linux
Verfasst: Freitag 10. September 2021, 09:43
von WuChenFu
Was mich irritiert ist der Umstand, das es nur beim start als Dienst Probleme macht, sonst nicht.
Code: Alles auswählen
from gpiozero import Button
import time, sys, gpiozero
import RPi.GPIO as GPIO
import MFRC522
import signal
from subprocess import Popen, PIPE
Das einzige "exotische" an dem Script ist der Aufruf von Twinkle.
Funktioniert aber sehr gut - nicht als Dienst.
Code: Alles auswählen
Popen(["twinkle", "-c"], stdin=PIPE, stdout=PIPE, bufsize=1)
Re: Script startet nicht als Dienst unter Linux
Verfasst: Freitag 10. September 2021, 09:53
von __deets__
Na da ist aber auch alles mit Hosenträger, Gürtel, und Gaffertape abgesichert. Zwei unterschiedliche GPIO Bibliotheken mixen, und die auf verschiedene Arten importiert….
Twinkle ist in c++ geschrieben, das ist also der Kandidat. Ist natürlich immer noch geraten, denn deinen Geheimcode kennt keiner. Ich würde einfach bei denen nachfragen, ob wer das Problem kennt. Und die üblichen Verdächtigen wie Pfade, Berechtigungen und Umgebung prüfen, denn die sind in der Unit anders.
Re: Script startet nicht als Dienst unter Linux
Verfasst: Freitag 10. September 2021, 11:45
von Dennis89
Re: Script startet nicht als Dienst unter Linux
Verfasst: Freitag 10. September 2021, 20:23
von WuChenFu
Danke für deine Antwort.
Ja noch ist einiges aus diversen Beispielen "zusammenkopiert" und im Grunde gefällt mir das so auch kein bisschen.
Ich mag Python nicht, komme aber langsam damit klar und so ging es schneller als wenn ich alles selbst in C++ geschrieben hätte.
Letzteres war bei meinen bisherigen Projekten (Arduino) kein Problem.
Sich auf fremde Bibliotheken zu verlassen kostet meiner Meinung nach meistens mehr Zeit, als selbst etwas zu schreiben, wenn man das denn kann.
Das gefrickel mit Twinkle funktioniert, aber schön oder ordentlich ist es noch nicht - wird es aber noch.
Werde mich aber hier noch melden, woran es gelegen hat ...
Re: Script startet nicht als Dienst unter Linux
Verfasst: Montag 13. September 2021, 10:40
von DeaD_EyE
WuChenFu hat geschrieben: ↑Freitag 10. September 2021, 20:23
Sich auf fremde Bibliotheken zu verlassen kostet meiner Meinung nach meistens mehr Zeit, als selbst etwas zu schreiben, wenn man das denn kann.
Es kommt auf die Bibliotheken an.
Es gibt Fälle, da muss man sich auf die Bibliotheken verlassen und diese selbst zu implementieren ist zu umständlich, kostet zu viel Zeit und sorgt für neue unentdeckte Bugs.
Außerdem gibt es Bibliotheken, die schon sehr lange existieren und nicht mehr wegzudenken sind.
Eigentlich müsstest du Twinkle neu programmieren, da du der Meinung bist, dass es weniger Zeit in Anspruch nimmt die Bibliotheken selbst zu programmieren.
Der Fehler kommt jedenfalls nicht von Python. Da muss wohl beim C++ Programm irgendwo ein Fehler sein.
Annahme: Du sendest dem C++ Programm Daten auf stdin, die dann zum Absturz führen.
Re: Script startet nicht als Dienst unter Linux
Verfasst: Dienstag 21. September 2021, 09:29
von WuChenFu
Nein, Twinkle werde ich nicht neu schreiben, aber deine Analyse trifft in etwa zu.
Es gibt eine Menge Bibliotheken die funktionieren wunderbar und dann gibt es das Gegenteil.
Was Python betrifft scheint mir der Unterschied zwischen Python2 und 3 ein Teil des Problems zu sein - man kann bei Klassen alles mögliche verbessern, aber man ändert nicht die API komplett, sondern erweitert diese nur.
Zu meinem Problem:
Ich hab diverse pyTwinkle Projekte ausprobiert und auch da ging es irgendwann nicht mehr weiter - funktionieren nicht.
Ich hab meinen Code um sämtliche anderen Bibliotheken bereinigt, das mit den unterschiedlichen GPIO Bibliotheken ebenfalls und es liegt definitiv an Twinkle.
Code: Alles auswählen
proc = Popen(["twinkle", "-c"], stdin=PIPE, stdout=PIPE, bufsize=1)
funktioniert in der Console, aber als Teil eines Service funktioniert es nicht - das ist noch weniger "schön" als es dieser murks bisher ist.
Ich dachte noch, es(Service) könnte mit Berechtigungen zu tun haben, aber da ist auch alles OK.
Re: Script startet nicht als Dienst unter Linux
Verfasst: Dienstag 21. September 2021, 09:40
von __blackjack__
@WuChenFu: Da werden sowohl `stdin` also auch `stdout` umgelenkt: Du stellst auch sicher, dass die beide *gleichzeitig* bedient werden, damit keine Verklemmung entstehen kann? Also das irgendwo ein Puffer vollläuft und Dein Programm darauf wartet etwas in `stdin` schreiben zu können während ``twinkle`` darauf wartet das Dein Programm etwas aus `stdout` liest, oder umgekehrt?
Re: Script startet nicht als Dienst unter Linux
Verfasst: Mittwoch 22. September 2021, 09:59
von WuChenFu
__blackjack__ hat geschrieben: ↑Dienstag 21. September 2021, 09:40
@WuChenFu: Da werden sowohl `stdin` also auch `stdout` umgelenkt: Du stellst auch sicher, dass die beide *gleichzeitig* bedient werden, damit keine Verklemmung entstehen kann? Also das irgendwo ein Puffer vollläuft und Dein Programm darauf wartet etwas in `stdin` schreiben zu können während ``twinkle`` darauf wartet das Dein Programm etwas aus `stdout` liest, oder umgekehrt?
Guter Punkt, bisher lief das ganze nach einem bestimmten Schema ab.
Ich starte Twinkle via Console und werte die Antworten aus, bzw. schreibe Befehle und von Vorn - das kann ja unter umständen bei einem Service anders sein.
Nur würde ich mir dann andere Fehlermeldungen wünschen.
Auch macht das Script am Anfang ja nix, die Verbindung wird erst hergestellt, wenn man einen Button drückt... den Teil hab ich nicht aus meinem Script entfernt.