Discord Bot automatisch neustarten

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: 185
Registriert: Freitag 4. Mai 2018, 18:13

Hallo,
ich programmiere zur Zeit einen Discord Bot.
Dieser läuft über einen Raspberry Pi, aber aufgrund diverser Umstände habe ich dort kein Lan, sondern eben nur Wlan.
Da das Wlan bei mir aber öfters ausfällt oder zu schwach wird, stürtzt der Bot hin und wieder ab.
Ist es möglich, den Bot nach Absturz wegen "Keine Verbindung" automatisch neustarten zu lassen?

Also mein Versuch war folgender:
Ein neues Programm, Starter.py mit folgendem Code

Code: Alles auswählen

def Starter():
    try:
        import Main  # Das ist mein Hauptprogramm
    except OSError: 
        print("error wegen Netzwerk")
        return Starter()


Starter()
So, wenn ich den Code ausführe und dem Pi das Netz nehme, kommt folgender Error:
Traceback (most recent call last):
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/discord/gateway.py", line 430, in poll_event
msg = yield from self.recv()
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/websockets/protocol.py", line 319, in recv
raise ConnectionClosed(self.close_code, self.close_reason)
websockets.exceptions.ConnectionClosed: WebSocket connection is closed: no code, no reason.

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/discord/client.py", line 448, in connect
yield from self.ws.poll_event()
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/discord/gateway.py", line 435, in poll_event
raise ResumeWebSocket() from e
discord.gateway.ResumeWebSocket

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/aiohttp/connector.py", line 601, in _create_direct_connection
local_addr=self._local_addr)
File "/usr/lib/python3.6/asyncio/base_events.py", line 778, in create_connection
raise exceptions[0]
File "/usr/lib/python3.6/asyncio/base_events.py", line 765, in create_connection
yield from self.sock_connect(sock, address)
File "/usr/lib/python3.6/asyncio/selector_events.py", line 450, in sock_connect
return (yield from fut)
File "/usr/lib/python3.6/asyncio/selector_events.py", line 455, in _sock_connect
sock.connect(address)
OSError: [Errno 101] Network is unreachable

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/aiohttp/connector.py", line 304, in connect
yield from self._create_connection(req)
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/aiohttp/connector.py", line 578, in _create_connection
transport, proto = yield from self._create_direct_connection(req)
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/aiohttp/connector.py", line 624, in _create_direct_connection
(req.host, req.port, exc.strerror)) from exc
aiohttp.errors.ClientOSError: [Errno 101] Can not connect to discordapp.com:443 [Network is unreachable]

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/home/phobit/PycharmProjects/DiscordSippenBot/Discord/Starter.py", line 6, in Starter
import Main
File "/home/phobit/PycharmProjects/DiscordSippenBot/Discord/Main.py", line 228, in <module>
client.run(SECRETS.TOKEN)
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/discord/client.py", line 519, in run
self.loop.run_until_complete(self.start(*args, **kwargs))
File "/usr/lib/python3.6/asyncio/base_events.py", line 468, in run_until_complete
return future.result()
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/discord/client.py", line 491, in start
yield from self.connect()
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/discord/client.py", line 452, in connect
self.ws = yield from DiscordWebSocket.from_client(self, resume=resume)
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/discord/gateway.py", line 203, in from_client
gateway = yield from client.http.get_gateway()
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/discord/http.py", line 633, in get_gateway
data = yield from self.request(Route('GET', '/gateway'))
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/discord/http.py", line 137, in request
r = yield from self.session.request(method, url, **kwargs)
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/aiohttp/client.py", line 555, in __iter__
resp = yield from self._coro
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/aiohttp/client.py", line 198, in _request
conn = yield from self._connector.connect(req)
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/aiohttp/connector.py", line 314, in connect
.format(key, exc.strerror)) from exc
aiohttp.errors.ClientOSError: [Errno 101] Cannot connect to host discordapp.com:443 ssl:True [Can not connect to discordapp.com:443 [Network is unreachable]]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/phobit/PycharmProjects/DiscordSippenBot/Discord/Starter.py", line 12, in <module>
Starter()
File "/home/phobit/PycharmProjects/DiscordSippenBot/Discord/Starter.py", line 9, in Starter
return Starter()
File "/home/phobit/PycharmProjects/DiscordSippenBot/Discord/Starter.py", line 6, in Starter
import Main
File "/home/phobit/PycharmProjects/DiscordSippenBot/Discord/Main.py", line 228, in <module>
client.run(SECRETS.TOKEN)
File "/home/phobit/PycharmProjects/DiscordSippenBot/venv/lib/python3.6/site-packages/discord/client.py", line 519, in run
self.loop.run_until_complete(self.start(*args, **kwargs))
File "/usr/lib/python3.6/asyncio/base_events.py", line 444, in run_until_complete
self._check_closed()
File "/usr/lib/python3.6/asyncio/base_events.py", line 358, in _check_closed
raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x7fb62f085a90>
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x7fb62f0975c0>


Dieser Error gleicht sich fast völlig dem "normalen" Error, wenn kein Netzwerk mehr da ist, nur das diesmal unten diese RuntimeError und Unclosed Session Zeilen auftauchen.
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Der Code hat zwei Probleme:

1. Importieren führt den Code auf Modulebene nur beim ersten Import aus, bei weiteren Importen wird einfach nur das dann ja bereits existierende Modulobjekt verwendet.

2. Die Rekursion sollte eine Schleife sein. Rekursionen darf man nicht verwenden um normale Schleifen zu ersetzen. Jedenfalls nicht in Sprachen die keine „tail call optimization“ haben/garantieren. Das wird Dir irgendwann mit einer Ausnahme abgebrochen wenn zu viel auf dem Aufrufstapel gelandet ist.

Ich würde das ”von aussen” lösen. Da es sich um einen Dienst handelt, wird man da ja irgend etwas verwenden das Dienste verwaltet. Also beispielsweise `systemd`, `supervisor`, `daemontools`, … und diese ”Dienstebeaufsichtiger” haben üblicherweise auch Mechanismen um Dienste neu zu starten, die abgestürzt sind.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Ist es dann egal, welchen dieser "Beaufsichtiger" ich nutze?
Oder brauch ich da bestimmte für bestimmte Programmarten?
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Im Grunde ist es egal, aber falls systemd sowieso schon da ist, weil das Betriebssystem den für alle Dienste verwendet, müsste man schon einen guten Grund haben etwas anderes zu benutzen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Ok, danke :D
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

So, ich hab jetzt versucht herauszufinden wie das via Python oder/und Systemd geht.
(Die gefundenen Python Skripte funktionieren alle nicht, am Ende steht immer der Error RuntimeError: Event loop is closed
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x7f7ac94888d0>
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x7f7ac947cb00>)

Langsam habe ich das Gefühl das die ganzen Probleme eher an Discord liegen...

So, aber jetzt habe ich folgenden Code im Netz gefunden:

Code: Alles auswählen

#!/usr/bin/python3 -u
import socket
TCP_IP = '127.0.0.1'
TCP_PORT = 5005
BUFFER_SIZE = 20  # Normally 1024, but we want fast response
while 1:
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   s.bind((TCP_IP, TCP_PORT))
   s.listen(1)
   
   conn, addr = s.accept()
   print('Connection address:', addr)
   while 1:
      data = conn.recv(BUFFER_SIZE)
      if not data: break
      print("received data:", data)
      conn.send(data)  # echo
   conn.close()
Der ganze Code sieht super aus, und im Rest des Tutorials wird auch noch alles zu Systemd etc erklärt, doch jetzt wollte ich wissen ob ich dieses CodeBeispiel auch auf den Discord Bot anwenden kann, bzw was genau dafür abgeändert werden muss...?!?!
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Code sieht katastrophal aus. Was willst Du denn damit machen?
Antworten