【发布时间】:2021-10-12 09:56:07
【问题描述】:
我想创建一个 python 脚本来检查服务器上的服务器是否启动。相反,如果服务器启动与否,我想在文件中捕获该结果。最后,如果服务器出现故障,那么我想收到一封电子邮件。
我使用教程https://linuxhint.com/python-server-monitoring-script/ 开始创建python 文件,结果如下。
当我执行 python 文件时,出现以下错误。我对工人阶级不是很熟悉。所以我希望你能在这里帮助我。
$ C:/Users/../AppData/Local/Programs/Python/Python38/python.exe c:/Users/.../Documents/git/CV%20Reader%20FastAPI/CheckServer.py
Traceback (most recent call last):
File "c:/Users/../Documents/git/CV%20Reader%20FastAPI/CheckServer.py",
line 77, in <module>
servers.pickle.load(open("servers.pickle","rb"))
NameError: name 'servers' is not defined
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "c:/Users/../Documents/git/../CheckServer.py",r.py", line 80, in <module>
Server("serveradres",80,"plain","high"),
File "c:/Users/../Documents/git/../CheckServer.py",r.py", line 12, in __init__
self.name
AttributeError: 'Server' object has no attribute 'name'
代码
from os import system
import socket
import ssl
import pickle
from datetime import datetime, time
import subprocess
import platform
class Server():
def __init__(self, name, port, connection, priority):
self.name
self.port
self.connection
self.priority
self.history = []
self.alert = False
def checkConnection(self):
msg = ""
succes = False
now = datetime.now
try:
if self.connection == "plain":
socket.create_connection((self.name,self.port),timeout=10)
msg = f"{self.name} is up. On Port {self.port} with {self.connection}"
succes = True
self.alert = False
elif self.connection == "ssl":
ssl.wrap_socket(socket.create_connection((self.name,self.port),timeout=10))
msg = f"{self.name} is up. On Port {self.port} with {self.connection}"
succes = True
self.alert = False
elif succes == False and self.alert == False:
# Send Alert
self.alert = True
# email_alert(self.name,f"{msg}\n{now}","erik.hoeven@gmail.com")
else:
if self.ping():
msg = f"{self.name} Timout on Port {self.port} with {self.connection}"
succes = True
self.alert = False
self.create_history(msg,succes,now)
except socket.timeout:
msg = f"{self.name} is Down. On Port {self.port}"
succes = False
alert = True
except:
pass
def ping(self):
try:
output = subprocess.check_output("ping - {} 1 {}".format('n' if platform.system.lower() == 'windowns' else 'c', self.name), shell = True, universal_newlines = True)
if 'unreachable' in output:
return False
else:
return True
except Exception:
return False
def create_history(self,msg,succes,now):
history_max = 100
self.history.append((msg,succes,now))
while len(self.history) > history_max:
self.history.pop(0)
if __name__ == "__main__":
try:
servers.pickle.load(open("servers.pickle","rb"))
except:
servers = [
Server("servername1",80,"plain","high"),
Server("servername2",5001,"plain","high")]
for server in servers:
server.checkConnection()
print(len(server.history))
print(server.history[-1])
pickle.dump(servers,open("serfvers.pickle","wb"))
【问题讨论】:
-
您正在尝试访问
servers,但您没有在它应该是什么之前声明 -
你的意思是写
servers = pickle.load(...而不是servers.pickle.load(...?!?