Hej!
Jag har en RPi3 som jag skapat ett Python3 skript på, problemet är att skriptet kraschar nästan varje dag och jag är inte helt säker på hur jag fixar det.
Jag är inte direkt så bra på Python och skriptet var mest gjort för att fungera och inte att vara snyggt gjort, men tyvärr så funkar det ju inte ens då det kraschar ibland. :P
Koden:
#!/usr/bin/python3
import urllib.request
import time
import subprocess
import datetime
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from tendo import singletonme = singleton.SingleInstance()
time.sleep(10)
link = "https://api.ipify.org"
ip = "none"
killed = False
firstRun = True
cmdKill = ['sudo pkill deluged']
cmdStart = ["runuser -l pi -c 'deluged'"]fromaddr = "[REDACTED]"
toaddr = "[REDACTED]"
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "VPN Failure: Deluge Killed"def ipdown(string2):
body = "VPN failure at: " + str(datetime.datetime.now()) + "\r\nCheck IP: " + str(ip) + "\r\nGet IP: " + str(string2)
msg.attach(MIMEText(body, 'plain'))
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(fromaddr, "[REDACTED]")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
returnwhile True:
with urllib.request.urlopen(link) as url:
string = url.read()
if (firstRun == True):
ip = string
firstRun = False
elif (killed == False and ip != string):
subprocess.call(cmdKill, shell=True)
print("Deluge Daemon killed at: %s" % datetime.datetime.now(), file=open("/home/pi/Desktop/ip_output.txt", "a"))
ipdown(string)
killed = True
elif (killed == True and ip == string):
subprocess.call(cmdStart, shell=True)
print("Deluge Daemon started at: %s" % datetime.datetime.now(), file=open("/home/pi/Desktop/ip_output.txt", "a"))
killed = False
time.sleep(1)
Felkoden jag får:
Traceback (most recent call last):
File "/usr/lib/python3.4/urllib/request.py", line 1174, in do_open
h.request(req.get_method(), req.selector, req.data, headers)
File "/usr/lib/python3.4/http/client.py", line 1090, in request
self._send_request(method, url, body, headers)
File "/usr/lib/python3.4/http/client.py", line 1128, in _send_request
self.endheaders(body)
File "/usr/lib/python3.4/http/client.py", line 1086, in endheaders
self._send_output(message_body)
File "/usr/lib/python3.4/http/client.py", line 924, in _send_output
self.send(msg)
File "/usr/lib/python3.4/http/client.py", line 859, in send
self.connect()
File "/usr/lib/python3.4/http/client.py", line 1221, in connect
super().connect()
File "/usr/lib/python3.4/http/client.py", line 836, in connect
self.timeout, self.source_address)
File "/usr/lib/python3.4/socket.py", line 491, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
File "/usr/lib/python3.4/socket.py", line 530, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not knownDuring handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "./checkip.py", line 41, in <module>
with urllib.request.urlopen(link) as url:
File "/usr/lib/python3.4/urllib/request.py", line 153, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.4/urllib/request.py", line 455, in open
response = self._open(req, data)
File "/usr/lib/python3.4/urllib/request.py", line 473, in _open
'_open', req)
File "/usr/lib/python3.4/urllib/request.py", line 433, in _call_chain
result = func(*args)
File "/usr/lib/python3.4/urllib/request.py", line 1217, in https_open
context=self._context, check_hostname=self._check_hostname)
File "/usr/lib/python3.4/urllib/request.py", line 1176, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [Errno -2] Name or service not known>
Exception ignored in: <bound method SingleInstance.__del__ of <tendo.singleton.SingleInstance object at 0x76a1e6f0>>
Traceback (most recent call last):
File "/usr/local/lib/python3.4/dist-packages/tendo/singleton.py", line 63, in __del__
File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
File "<frozen importlib._bootstrap>", line 2222, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 2155, in _find_spec
TypeError: 'NoneType' object is not iterable
Jag tror att detta händer när internet ligger nere vilket resulterar i error som inte hanteras, är dock inte helt säker på vart i min egen kod detta händer samt hur jag fixar det? Antar att jag måste ha en Try, Catch eller liknande någonstans?
Någon som är bra på detta som kan ge några tips?