You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python服务器监控脚本报IndexError、检测结果缺失问题求助

问题修复方案

根因说明

你遇到的两个问题均由代码中的语法错误、逻辑疏漏导致:

  1. 首次IndexError报错:ping方法存在语法错误,执行时抛出未捕获的异常,导致create_history方法未执行,history列表为空,访问下标[-1]直接报错
  2. 修改后部分服务器结果被跳过:未完全修复所有逻辑漏洞,部分分支仍然没有正确写入检测结果,或者执行异常直接中断循环

需修改的具体点

  • 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:54:06