Python如何监测ping状态变化 让Discord bot仅在服务器离线时发一次消息
问题根源
原有代码未存储上一次的ping状态,且每次循环都会重置状态标记变量,所以只要满足状态条件就会每次循环都发送消息,导致重复推送。
修改后代码
# 循环外定义全局变量存储上一次的状态,初始默认设为在线状态1 last_status = 1 # 建议给循环设置合理的运行间隔,比如每30秒检测一次,避免占用过多资源 @tasks.loop(seconds=30) async def serverstatus(): global last_status channel = bot.get_channel(850531139403776040) # 注意提前定义好ip变量为你要监测的服务器地址 status = os.system("ping -c 1 " + ip) # 仅当状态从在线1切换为离线0时,发送1次离线提醒 if status == 0 and last_status == 1: await channel.send(f"<@&850539902675845170> Server Offline") last_status = 0 # 可选配置:服务器从离线恢复为在线时,发送1次上线提醒 elif status == 1 and last_status == 0: await channel.send("Server Online") last_status = 1
补充说明
- 注意确认你的系统ping命令返回值规则:Linux默认ping成功返回0、失败返回非0,如果你实际测试后发现状态码和预期逻辑相反,调整判断条件里的数值即可。
- 如果你不想用全局变量,可以把状态存储在bot实例属性中,比如用
bot.last_status替代全局变量,避免全局变量污染。 - 合理设置检测间隔,不要太过频繁,避免触发Discord的消息限流规则。
内容的提问来源于stack exchange,提问作者pach
相关产品推荐
相关产品推荐

