[Errno 104]Connection Reset by peer

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Phobit
User
Beiträge: 126
Registriert: Freitag 4. Mai 2018, 18:13

Samstag 12. Januar 2019, 11:19

Hallo mal wieder,
ich habe vor kurzem meinen Server (raspbian stretch lite) neu aufgesetzt, meinen Discord Bot draufgepackt, und seitdem stürzt er im Laufe von 1-2 Tagen dauernd wegen dem Error [Errno 104] Connection reset by peer ab...
Hab schon gelesen, dass dieser Error nicht unbekannt ist und das das scheinbar eher am Pi als am Bot liegt.
Jetzt würd mich blos interessieren, weiß hier jemand ob es eine simple Möglichkeit gibt, diesen Error mit try/except abzufangen, den Bot komplett zu schließen (Also es darf nichts mehr an der Verbindung überbleiben, sonst wirft den nächsten Fehler) und ihn anschließend wieder neuzustarten? Quasi:

Code: Alles auswählen

try:
	#Bot soll laufen
except Errno 104:
	# Bot schießen,
	quit()
	# Und das ganze Programm neustarten
	main()
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 1865
Registriert: Samstag 2. Juni 2018, 10:21

Samstag 12. Januar 2019, 12:40

@Phobit: Lass Dir Ausgaben/Protokollieren was das genau für eine Ausnahme ist, und dann schau mal in die Dokumentation von der Ausnahme wie man im ``except``-Zweig dann an die Fehlernummer kommt um genau die zu prüfen. Es kann sein, das die Ausnahme von einer bestehenden Ausnahme abgeleitet ist und man dann auch deren Dokumentation lesen muss.

Das mit dem `main()`-Aufruf ist keine gute Idee wenn dieses Konstrukt selbst in der `main()`-Funktion steht. Und das sollte es eigentlich, denn wenn nicht, dann hättest Du ja vor der Hauptfunktion noch eine andere Funktion und damit wäre die Hauptfunktion nicht mehr der Einstiegspunkt in das Programm. Was überraschend wäre.
Having more money does not insure happiness. People with ten million dollars are no happier than people with nine million dollars. – Hobart Brown
Benutzeravatar
snafu
User
Beiträge: 5695
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Samstag 12. Januar 2019, 14:05

Das rein semantische Vorgehen wäre:

Code: Alles auswählen

def main():
    while True:
        try:
            bot.start()
        except Error:
            bot.close()
Dies nimmt an, dass bot.start() blockiert, d.h. die weitere Ausführung wartet dann solange bis start() auf welche Weise auch immer beendet ist. Im Fehlerfall übernähme der except-Teil das Schließen. Die Schleife beginnt dann erneut, also mit dem Starten des Bots.

Die Frage ist aber, ob ein Schließen überhaupt etwas bringt, wenn die Verbindung zum Bot unerwartet unterbrochen wurde. Merkt der sich seinen alten Zustand und kann noch Aufräumarbeiten tätigen? Und ist ein Schließen in dem Fall überhaupt noch vom Bot erlaubt? Oder verwaltet der Bot ein oder mehrere Verbindungen und es ist eine von denen gemeint? Da müsstest du mehr Hintergrundwissen liefern, falls das "naive" obige Vorgehen nicht hilft...
Phobit
User
Beiträge: 126
Registriert: Freitag 4. Mai 2018, 18:13

Sonntag 13. Januar 2019, 19:24

Die Frage ist aber, ob ein Schließen überhaupt etwas bringt, wenn die Verbindung zum Bot unerwartet unterbrochen wurde
Es wurde ja nicht die Verbindung zum Bot, sondern vom Bot zu Discord unterbrochen, und der Bot schafft es nicht sich wiederzuverbinden... Das Problem ist, wenn man ihn ohne richtig zu schließen einfach hardcore neustartet, heißt es immer bei error "unclosed session"... das komplette Programm müsste gekillt werden und dann komplett neu ausgeführt...mittlerweile frag ich mich ob das überhaupt ne Aufgabe ist die der bot übernehmen kann, oder ob bei sowas nicht der server, also Linux, ihn einfach killen&neustarten sollte...
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Antworten