Python持续Ping主机脚本问题:无法获取持续Ping结果求助
问题原因
你的核心问题出在ping -t参数上——Windows系统下ping -t会无限循环发送ping包,不会主动终止执行,这就导致os.popen(...).read()会一直阻塞,永远等不到命令执行完毕返回结果,自然无法处理后续逻辑。
解决方案
要实现持续监控主机状态的需求,不能依赖-t参数,而是要循环执行有限次数的ping命令,每次执行完毕就检查结果,同时记录时间戳并只将宕机日志写入CSV。另外,推荐用subprocess模块替代os.popen,它更安全,也能更灵活地处理命令输出。
以下是修改后的完整代码:
import subprocess import csv import time from datetime import datetime # 生成要监控的IP列表 ip_list = [f"10.100.{ip}.1" for ip in range(1, 11)] # 打开CSV日志文件(追加模式,避免覆盖历史日志) with open("ping_down_logs.csv", "a", newline="", encoding="utf-8") as csvfile: # 定义CSV表头 fieldnames = ["timestamp", "ip", "status"] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) # 如果文件为空,先写入表头 if csvfile.tell() == 0: writer.writeheader() # 持续监控循环(按Ctrl+C可终止) while True: for ip in ip_list: # 执行单次ping检测(Windows用-n指定次数,这里设为1次快速检测) result = subprocess.run( ["ping", ip, "-n", "1"], capture_output=True, text=True, shell=False ) # 判断主机是否宕机 if "Request timed out" in result.stdout: # 生成格式化时间戳 current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 写入宕机日志到CSV writer.writerow({ "timestamp": current_time, "ip": ip, "status": "DOWN - Request timed out" }) # 立即刷新缓冲区,防止程序意外退出丢失数据 csvfile.flush() print(f"{current_time} - {ip} 主机宕机") # 每轮检测后等待10秒,可根据需求调整间隔时间 time.sleep(10)
关键细节说明
- 替换
os.popen为subprocess.run:能直接捕获命令的返回值和输出,参数可控性更强,安全性更高。 - 用
-n 1替代-t:每次只执行1次ping检测,快速获取当前状态,通过外层while True循环实现持续监控。 - CSV规范写入:使用
csv.DictWriter保证日志格式统一,追加模式打开文件避免覆盖历史记录,写入后立即刷新缓冲区防止数据丢失。 - 跨平台适配:如果是Linux/macOS环境,需将ping参数改为
-c 1,宕机判断字符串改为100% packet loss。
内容的提问来源于stack exchange,提问作者kalpana ramesh
相关产品推荐
相关产品推荐

