staging.inyokaproject.org

home assistant lässt sich nicht stoppen

Status: Ungelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

jms3000

Avatar von jms3000

Anmeldungsdatum:
29. Januar 2015

Beiträge: 880

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.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Im Debugger starten oder ihn an den Prozess anhängen (wenn das geht)?

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Das meiste ist asynchron programmiert, ein einfacher Trace wird wohl nicht funktionieren.

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

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

strace hilft auch manchmal.

jms3000

(Themenstarter)
Avatar von jms3000

Anmeldungsdatum:
29. Januar 2015

Beiträge: 880

noisefloor schrieb:

Hallo,

Das meiste ist asynchron programmiert, ein einfacher Trace wird wohl nicht funktionieren.

Weil...? Warum glaubst du das?

Programm via Terminl starten, schauen ob / was da geloggt wird und wenn es hängt mit STRG+C beenden.

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.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Bei Ctrl-C hört es einfach auf

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

jms3000

(Themenstarter)
Avatar von jms3000

Anmeldungsdatum:
29. Januar 2015

Beiträge: 880

noisefloor schrieb:

Hallo,

Bei Ctrl-C hört es einfach auf

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.

Da kommt gar nichts. Denn es hängt ja nicht wirklich, sondern irgend ein nebenläufiger Thread hört einfach nicht auf.

Bekommst du sonst Ausgaben im Terminal, wenn das Prog läuft?

Nichts auffälliges.

karzer Team-Icon

Wikiteam
Avatar von karzer

Anmeldungsdatum:
10. April 2022

Beiträge: 1575

Wie wäre es denn mit dem Vorschlag von rklm?

strace homeassistant 

jms3000

(Themenstarter)
Avatar von jms3000

Anmeldungsdatum:
29. Januar 2015

Beiträge: 880

karzer schrieb:

Wie wäre es denn mit dem Vorschlag von rklm?

strace homeassistant 

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:

1
2
3
4
5
6
           for thread in threading.enumerate():
                if thread.is_alive() and not thread.daemon:
                    print(thread.name)
                    frame = sys._current_frames().get(thread.ident, None)
                    if frame:
                        print("  ",frame.f_code.co_filename, frame.f_code.co_name, frame.f_code.co_firstlineno)

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

jms3000 schrieb:

karzer schrieb:

Wie wäre es denn mit dem Vorschlag von rklm?

strace homeassistant 

Das würde sicher mehrere Tage laufen. Schon ein python -m trace homeassistant.py läuft mehrere Stunden bevor er abbricht.

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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/sh

# run strace with some default settings

test -n "$DEBUG" && set -x
set -e

base="${TMP:-/tmp}/$(id -un)"
mkdir -p "$base"
dir="$(mktemp -d "--tmpdir=$base")"
trap 'rm -rf "$dir"' 0
trap 'exit 1' INT TERM QUIT HUP

set +e
strace -v -s 1024 -ff -o "$dir/trc" "$@"
stat=$?

cat <<EOM
Exited with status $stat.
Enter "exit" to exit and remove temp files.
EOM

cd "$dir"
"$SHELL"

exit $stat

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Mit diesem Code habe ich jetzt ein bisschen was rausgefunden:

Was hast du denn herausgefunden bzw. was willst du mit dem Codeschnipsel sagen?

Das würde sicher mehrere Tage laufen. Schon ein python -m trace homeassistant.py läuft mehrere Stunden bevor er abbricht.

Ja, aber wenn du wirklich herausfinden willst, woran es liegt, hast du halt nicht so viele Optionen.

Gruß, noisefloor

jms3000

(Themenstarter)
Avatar von jms3000

Anmeldungsdatum:
29. Januar 2015

Beiträge: 880

noisefloor schrieb:

Hallo,

Mit diesem Code habe ich jetzt ein bisschen was rausgefunden:

Was hast du denn herausgefunden bzw. was willst du mit dem Codeschnipsel sagen?

Mein Codeschnipsel hat rausgeschrieben, in welchem Modul und welcher Funktion der aktive Thread sich befindet.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Mein Codeschnipsel hat rausgeschrieben, in welchem Modul und welcher Funktion der aktive Thread sich befindet.

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 frame = ... Aufruf, wenn der blockieren würden. Dann müsstest du aber einen Traceback bei STRG+C bekommen.

Gruß, noisefloor

jms3000

(Themenstarter)
Avatar von jms3000

Anmeldungsdatum:
29. Januar 2015

Beiträge: 880

Dieser Code dient dazu rauszufinden, ob noch ein Thread aktiv ist und wenn ja, seinen Namen zu finden:

1
2
3
4
5
6
           for thread in threading.enumerate():
                if thread.is_alive() and not thread.daemon:
                    print(thread.name)
                    frame = sys._current_frames().get(thread.ident, None)
                    if frame:
                        print("  ",frame.f_code.co_filename, frame.f_code.co_name, frame.f_code.co_firstlineno)

Damit konnte ich rausfinden, welcher Thread noch läuft und somit verhindert, dass das Programm enden kann.

Antworten |