Python服务器监控脚本报IndexError、检测结果缺失问题求助
问题修复方案
根因说明
你遇到的两个问题均由代码中的语法错误、逻辑疏漏导致:
- 首次
IndexError报错:ping方法存在语法错误,执行时抛出未捕获的异常,导致create_history方法未执行,history列表为空,访问下标[-1]直接报错 - 修改后部分服务器结果被跳过:未完全修复所有逻辑漏洞,部分分支仍然没有正确写入检测结果,或者执行异常直接中断循环
需修改的具体点
- 修正
ping方法的语法和拼写错误:platform.system是方法需加括号调用,修正为platform.system().lower()- 系统名拼写错误,将
windowns改为windows - ping命令参数格式错误,去掉横线后的多余空格
- 修正
checkConnection的逻辑错误:socket.timeout捕获块中的alert = True改为self.alert = True,否则仅修改局部变量不生效- 通用异常捕获块中显式设置
succes = False - 补充非plain/ssl连接模式下ping失败的分支逻辑,设置对应报错信息
- 可选:在遍历服务器时增加异常捕获,避免单个服务器检测异常中断整个检测流程
修正后的完整代码
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 = name self.port = port self.connection = connection self.priority = 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 else: if self.ping(): msg = f"{self.name} is up (ping检测). On Port {self.port} with {self.connection}" succes = True self.alert = False else: msg = f"{self.name} is Down (ping检测失败)" succes = False except socket.timeout: msg = f"{self.name} is Down. On Port {self.port} (连接超时)" succes = False self.alert = True except Exception as e: msg = f"No Clue??: {e}" succes = False if succes == False and self.alert == False: # 触发邮件告警 self.alert = True # email_alert(self.name,f"{msg}\n{now}","erik.hoeven@gmail.com") self.create_history(msg,succes,now) def ping(self): try: # 修正参数格式、语法、拼写错误 output = subprocess.check_output("ping -{} 1 {}".format('n' if platform.system().lower() == 'windows' else 'c', self.name), shell = True, universal_newlines = True) if 'unreachable' in output or '请求超时' 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__": # 首次运行建议删除旧的servers.pickle文件,避免加载错误的旧数据 try: servers = pickle.load(open("servers.pickle","rb")) except: servers = [ Server("185.104.29.80",80,"plain","high"), Server("34.91.11.178",5001,"plain","high"), Server("reddit.com",80,"plain","high"), Server("msn.com",80,"plain","high"), Server("smtp.gmail.com",465,"ssl","high") ] for server in servers: # 单个服务检测异常不中断全局流程 try: server.checkConnection() print(len(server.history)) print(server.history[-1]) except Exception as e: print(f"检测{server.name}时出现未处理异常: {str(e)}") pickle.dump(servers,open("servers.pickle","wb"))
内容的提问来源于stack exchange,提问作者Erik hoeven
相关产品推荐
相关产品推荐

