Thema: Restarter in Python

m
matt57 23.05.2016 17:48
Hallo, nach dem letzten Upgrade des Betriebsystems meines Raspberry Pi2 von Ubuntu Mate 15.10 auf Ubuntu Mate 16.04 LTS verweigerte der Restarter die Arbeit. Angeblich wäre die falsche Java-Version installiert ...

s4ger hatte in einem früheren Post gezeigt, dass man unter Linux einen Restarter mit einem Bash-Script realisieren kann. Aber auch diese Möglichkeit funktionierte nicht auf meinem System.

Ich brauchte also eine Lösung, bei der sowohl auf die bash als auch auf Java verzichtet werden konnte. Da bot sich die Programmiersprache Python an, die wohl bei jeder Raspberry Pi-Installation auf Linux-Basis dabei ist.

Nach diversen Recherchen im Internet sowie einigem Probieren entstand das folgende Script:

#=====================
#restarter.py

import webbrowser
import requests
import time
import os

#einstellbare Wartezeit
delay=600
#Speicher für Usernamen
uname='XXXXX'
#Restarter-Code
rcode='YYYYYYYYYY'

requestlink='http://www.ebesucher.de/?link=restarterzugriff&username='+uname+'&code='+rcode
surflink='http://www.ebesucher.de/surfbar/'+uname

bTrue = 1
while bTrue:
data = requests.get(requestlink)
print(data.text)
if "Timeout_reached=true" in data.text:
print("Timeout: restarting ...")
os.system("killall -9 firefox")
time.sleep(30)
webbrowser.open(surflink)
else:
print("Timeout not reached")
print("Restart not required ...")
time.sleep(delay)

#=====================

Bitte beachten: Die Zeichenfolge XXXXX durch den Usernamen ersetzen, die Zeichenfolge YYYYYYYYYY durch den Restarter-Code.

Wichtig: Das ist ein Python3-Script. Der Aufruf erfolgt im Terminal mit: python3 restarter.py

Die Funktion webbrowser.open() startet den Standardbrowser. Bei mir ist das Firefox. Sollte es ein anderer sein, muss die Zeichenkette 'firefox" durch z.B. 'iceweasel' ersetzt werden.

Für die ordnungsgemäße Funktion kann ich natürlich keine Garantie übernehmen. Auf meinem Raspberry Pi 2 mit Ubuntu 16.04 ist das Script bereits im Einsatz. Die Surfbar läuft damit stabil.

Da nichts so gut ist, als dass es nicht noch verbessert werden könnte, bin ich gespannt auf weitere Optimierungsvorschläge. Ich würde mich auch freuen, wenn bei erfolgreichem Einsatz hier ein kurze Mitteilung hinterlassen wird.

mit freundlichen Grüßen
matt57

djoni 27.05.2016 09:31
Hallo! Wir freuen uns, dass Du hier kreativ geworden bist und eine für dich passende Lösung gefunden hast. Uns interessiert natürlich auch, ob dies anderen Nutzern weiterhilft. Wir werden Deinen Thread daher aktiv verfolgen.

m
matt57 01.07.2016 18:03
Das Python-Script ist seit dem 25.05.2016 unverändert in Betrieb. Prinzipiell läuft es stabil, gäbe es nicht diverse, nicht von mir beeinflussbare Ereignisse, die auch das Python-Script zum "Absturz" bringen können.

Zu diesen Ereignissen gehört auch die folgende Fehlermeldung, die direkt vom RasPi-Terminal kopiert wurde:
*************************
A coding exception was thrown in a Promise resolution callback.
See https://developer.mozilla.org/Mozilla/JavaScript_code_modules/Promise.jsm/Promise

Full message: TypeError: aWindow is null
Full stack: [EMAIL="pbu_privacyContextFromWindow@resource://gre/modules/PrivateBrowsingUtils.jsm"]pbu_privacyContextFromWindow@resource://gre/modules/PrivateBrowsingUtils.jsm[/EMAIL]:49:5
[EMAIL="pbu_isWindowPrivate@resource://gre/modules/PrivateBrowsingUtils.jsm"]pbu_isWindowPrivate@resource://gre/modules/PrivateBrowsingUtils.jsm[/EMAIL]:33:12
[EMAIL="LoginManagerContent.loginsFound@resource://gre/modules/LoginManagerContent.jsm"]LoginManagerContent.loginsFound@resource://gre/modules/LoginManagerContent.jsm[/EMAIL]:501:43
[EMAIL="Handler.prototype.process@resource://gre/modules/Promise.jsm"]Handler.prototype.process@resource://gre/modules/Promise.jsm[/EMAIL] -> resource://gre/modules/Promise-backend.js:937:23
[EMAIL="this.PromiseWalker.walkerLoop@resource://gre/modules/Promise.jsm"]this.PromiseWalker.walkerLoop@resource://gre/modules/Promise.jsm[/EMAIL] -> resource://gre/modules/Promise-backend.js:816:7
this.PromiseWalker.scheduleWalkerLoop/<@resource://gre/modules/Promise.jsm -> resource://gre/modules/Promise-backend.js:750:11

*************************

Die folgenden Meldungen brachten nicht nur den Browser samt Surfbar zum Absturz, auch das Python-Script wurde beendet:

*************************

ExceptionHandler::GenerateDump cloned child 29348
ExceptionHandler::SendContinueSignalToChild sent continue signal to child
ExceptionHandler::WaitForContinueSignal waiting for continue signal...

(crashreporter:29349): Gtk-WARNING **: Theme parsing error: gtk-main.css:69:33: Failed to import: Fehler beim Öffnen der Datei: Datei oder Verzeichnis nicht gefunden
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 137, in _new_conn
(self.host, self.port), self.timeout, **extra_kw)
File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 67, in create_connection
for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
File "/usr/lib/python3.5/socket.py", line 732, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -3] Temporary failure in name resolution

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 560, in urlopen
body=body, headers=headers)
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 354, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/usr/lib/python3.5/http/client.py", line 1106, in request
self._send_request(method, url, body, headers)
File "/usr/lib/python3.5/http/client.py", line 1151, in _send_request
self.endheaders(body)
File "/usr/lib/python3.5/http/client.py", line 1102, in endheaders
self._send_output(message_body)
File "/usr/lib/python3.5/http/client.py", line 934, in _send_output
self.send(msg)
File "/usr/lib/python3.5/http/client.py", line 877, in send
self.connect()
File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 162, in connect
conn = self._new_conn()
File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 146, in _new_conn
self, "Failed to establish a new connection: %s" % e)
requests.packages.urllib3.exceptions.NewConnectionError: <requests.packages.urllib3.connection.HTTPConnection object at 0x761a75f0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/requests/adapters.py", line 376, in send
timeout=timeout
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 610, in urlopen
_stacktrace=sys.exc_info()[2])
File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 273, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
requests.packages.urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='www.ebesucher.de', port=80): Max retries exceeded with url: /?link=restarterzugriff&username=matt57&code=e7SjvvRtAmw3 (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x761a75f0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution',))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "restarter.py", line 18, in <module>
data = requests.get(requestlink)
File "/usr/lib/python3/dist-packages/requests/api.py", line 67, in get
return request('get', url, params=params, **kwargs)
File "/usr/lib/python3/dist-packages/requests/api.py", line 53, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 468, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python3/dist-packages/requests/sessions.py", line 576, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python3/dist-packages/requests/adapters.py", line 437, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='www.ebesucher.de', port=80): Max retries exceeded with url: /?link=restarterzugriff&username=matt57&code=e7SjvvRtAmw3 (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x761a75f0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution',))

*************************

Für die "Behandlung" derartiger Fehler ist das Script nicht ausgelegt. Abhilfe? Wahrscheinlich muss ein CronJob her, der regelmäßig nachsieht, ob das Script noch läuft und im Bedarfsfall dieses neu startet. Damit muss ich mich aber erst noch richtig beschäftigen, dazu reichen meine Linux-Kenntnisse noch nicht aus. Wenn es soweit ist, werde ich mich wieder melden.

Viele Grüße
matt57

Jeff 02.07.2016 14:27
Wenn man den Fehlermeldungen glauben darf, war deine Internetverbindung kurz weg bzw. der DNS-Server nicht verfügbar.
Hast du schon versucht die Exception abzufangen? Siehe python try and catch.