Wenn ich das Python-Programm "homeassistant" starte, kann ich in der GUI auf "beenden" (bzw. Restart) klicken. Das Programm fängt an alles zu beenden, aber dann hängt es. Wie kann ich herausfinden, wo es hängt? Das meiste ist asynchron programmiert, ein einfacher Trace wird wohl nicht funktionieren.
home assistant lässt sich nicht stoppen
![]() Anmeldungsdatum: Beiträge: 796 Wohnort: Schwetzingen |
|
||
Projektleitung
Anmeldungsdatum: Beiträge: 12713 |
Im Debugger starten oder ihn an den Prozess anhängen (wenn das geht)? |
||
Ehemaliger
![]() Anmeldungsdatum: Beiträge: 28765 Wohnort: WW |
Hallo,
Weil...? Warum glaubst du das? Programm via Terminl starten, schauen ob / was da geloggt wird und wenn es hängt mit STRG+C beenden. Gruß, noisefloor |
||
Projektleitung
Anmeldungsdatum: Beiträge: 12713 |
|
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 796 Wohnort: Schwetzingen |
Weil das Programm am Ende einfach mit dem Code zuende ist, aber nicht stoppt, weil irgend ein Thread noch läuft. Bei Ctrl-C hört es einfach auf. |
||
Ehemaliger
![]() Anmeldungsdatum: Beiträge: 28765 Wohnort: WW |
Hallo,
Welche Traceback bekommst du, wenn du das Programm von der Kommandozeile startest und am Ende, wenn die GUI "hängt", STRG+C drückst? Bitte den kompletten Traceback posten, nicht nur die letzten Zeilen. Bekommst du sonst Ausgaben im Terminal, wenn das Prog läuft? Gruß, noisefloor |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 796 Wohnort: Schwetzingen |
Da kommt gar nichts. Denn es hängt ja nicht wirklich, sondern irgend ein nebenläufiger Thread hört einfach nicht auf.
Nichts auffälliges. |
||
Wikiteam
![]() Anmeldungsdatum: Beiträge: 1244 Wohnort: Bad Oeynhausen |
Wie wäre es denn mit dem Vorschlag von rklm? strace homeassistant |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 796 Wohnort: Schwetzingen |
Das würde sicher mehrere Tage laufen. Schon ein python -m trace homeassistant.py läuft mehrere Stunden bevor er abbricht. Mit diesem Code habe ich jetzt ein bisschen was rausgefunden:
|
||
Projektleitung
Anmeldungsdatum: Beiträge: 12713 |
Du kannst ja den Prozess abbrechen, wenn er sich in der Schleife verabschiedet. Ich nutze da dieses Skript, das passende Parameter setzt und die Ausgabe gleich in Dateien in einem temporären Verzeichnis schreibt, in dem dann eine Shell geöffnet wird, nachdem der Prozess terminiert ist.
|
||
Ehemaliger
![]() Anmeldungsdatum: Beiträge: 28765 Wohnort: WW |
Hallo,
Was hast du denn herausgefunden bzw. was willst du mit dem Codeschnipsel sagen?
Ja, aber wenn du wirklich herausfinden willst, woran es liegt, hast du halt nicht so viele Optionen. Gruß, noisefloor |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 796 Wohnort: Schwetzingen |
Mein Codeschnipsel hat rausgeschrieben, in welchem Modul und welcher Funktion der aktive Thread sich befindet. |
||
Ehemaliger
![]() Anmeldungsdatum: Beiträge: 28765 Wohnort: WW |
Hallo,
Woher weißt du das? Vom Debugger? Von Trace? Handauflegen aufm Laptop? Der gezeigten Code kann eigentlich nur an zwei Stellen blockieren: wenn es unendlich viele Threads gäbe (ziemlich unwahrscheinlich) oder beim Gruß, noisefloor |
||
(Themenstarter)
![]() Anmeldungsdatum: Beiträge: 796 Wohnort: Schwetzingen |
Dieser Code dient dazu rauszufinden, ob noch ein Thread aktiv ist und wenn ja, seinen Namen zu finden:
Damit konnte ich rausfinden, welcher Thread noch läuft und somit verhindert, dass das Programm enden kann. |