Bei Programmabsturz automatisch neu starten

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Jonny550
User
Beiträge: 7
Registriert: Freitag 24. Juli 2015, 11:40

Hallo,
gibt es die Möglichkeit abzufragen und dann auszuführen: "Wenn Programm >2 Sek nichts macht/kein Messwert ausgibt: starte es neu“?

Denn mein Programm stürzt ab und zu ab. Dies kann nach 10 min passieren, kann aber auch drei Stunden durchlaufen. Deshalb möchte ich es gerne beim Absturz automatisch neu starten lassen, damit nur ein kurzer Ausfall ist.
BlackJack

@Jonny550: Theoretisch ja. Wie man das praktisch macht kommt auf die Umstände/Randbedingung an. Du könntest beispielsweise ein Watchdog-Programm schreiben welches Dein eigentliches Programm startet und überwacht und ggf. beendet und neu startet.

Bessere wäre es aber das Problem direkt zu lösen anstatt mit solch einer Holzhammermethode auf das Symptom zu schlagen.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wie genau äußert sich der Absturz denn? Handelt es sich um eine Python-Exception? Diese könnte man nämlich ganz einfach in einer Schleife mittels try-except-Block abfangen. Möglicherweise reicht dann schon so etwas:

Code: Alles auswählen

def main():
    while True:
        try:
            start_program()
        except DeinError as e:
            # Fehler "verschlucken" und Schleife von vorne beginnen
            #pass
            # besser noch: Den Fehler protokollieren
            logging.error(e)
Jonny550
User
Beiträge: 7
Registriert: Freitag 24. Juli 2015, 11:40

Es gibt keine Fehlermeldung. Das Programm berechnet von zwei Sensoren die Entfernung zu einem Gegenstand. Diese Sensoren sind nicht die Besten und manchmal hängt das Programm dann einfach und versucht weiter einen Wert zu bekommen aber bekommt diesen nicht.
Er hängt in dieser while-Schleife:

while GPIO.input(GPIOEcho1) == 0:
StartTime1 = time.time()
BlackJack

@Jonny550: Ja aber dann kannst Du Dir doch eine Funktion schreiben die diesen Pin nur eine Zeit lang abfragt und wenn dann nichts kommt eine Ausnahme auslöst. Also wie schon gesagt: Das Problem an der Wurzel angehen und nicht viel später, sozusagen von aussen, das Symptom behandeln.

Ausserdem kann auf Änderungen an Pins mit `GPIO` auch warten ohne eine „busy loop“ zu programmieren die den Prozessor die ganze Zeit im Grunde sinnlos beschäftigt.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Operationen mit Geräteschnittstellen sollten (wie so vieles andere auch) möglichst fehlertolerant programmiert sein. Das heißt, Dinge wie angemessene Pausen zwischen Operationen, wiederholtes Versuchen nach Ablauf einer bestimmten Reaktionszeit, etc sollten eingebaut sein. Falls es nötig ist, für eine bestimmte Operation vorab eine Startsequenz ("Handshake") zu übermitteln, dann muss ggf auch dies wiederholt werden. Ich würde mich beim Programmieren gegen Geräteschnittstellen niemals darauf verlassen, dass immer alles beim ersten Versuch funktioniert. Zwar wird der Code für die entsprechende Fehlerbehandlung dann zwar umfangreicher, aber in aller Regel ist dies für die spätere Verwendung angenehmer, anstatt einen unzuverlässigen "Absturz-Code" zu haben.
Antworten