Script startet nicht als Dienst unter Linux

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
WuChenFu
User
Beiträge: 5
Registriert: Donnerstag 9. September 2021, 16:04

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

journalctl -f
.

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ohne das Skript aussehen: nein. Denn das ist ein C++ Fehler, und der kommt denke ich aus einer uns noch unbekannten Bibliothek.
WuChenFu
User
Beiträge: 5
Registriert: Donnerstag 9. September 2021, 16:04

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)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
Dennis89
User
Beiträge: 1376
Registriert: Freitag 11. Dezember 2020, 15:13

__deets__ hat geschrieben: Freitag 10. September 2021, 09:53 Na da ist aber auch alles mit Hosenträger, Gürtel, und Gaffertape abgesichert.
:lol: :lol: :lol:

Sorry für den Kommentar von mir, aber mir ist bei lesen fast das Essen aus dem Mund gefallen :D
"When I got the music, I got a place to go" [Rancid, 1993]
WuChenFu
User
Beiträge: 5
Registriert: Donnerstag 9. September 2021, 16:04

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 ...
Benutzeravatar
DeaD_EyE
User
Beiträge: 1121
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
WuChenFu
User
Beiträge: 5
Registriert: Donnerstag 9. September 2021, 16:04

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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?

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
WuChenFu
User
Beiträge: 5
Registriert: Donnerstag 9. September 2021, 16:04

__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.
Antworten