如何使用Python实现Discord机器人自动重启功能
当然可以实现这个自动重启功能!针对你在树莓派3上运行的Python 3.6.5 Discord机器人,我整理了一套实用的方案,兼顾脚本内检测和系统级守护,确保机器人在WiFi断开后能自动恢复:
核心思路
我们需要做两件关键的事:一是让机器人自己检测到离线状态,触发重启;二是如果重启失败(比如WiFi还没恢复),设置5分钟后重试。另外,为了避免进程崩溃导致内部逻辑失效,配合系统级的守护进程会更可靠。
具体实现步骤
1. 脚本内添加离线检测与重启逻辑
假设你用的是Discord.py(Python开发Discord机器人最常用的库),我们可以利用库自带的事件监听,再加上定时连接状态检查,双重确保能检测到离线:
首先,确保你安装了适配Python3.6的Discord.py版本(比如discord.py==1.7.3,这个版本支持3.6),然后修改你的机器人代码:
import discord import os import sys import time import asyncio from discord.ext import commands bot = commands.Bot(command_prefix='!') # 可选:设置最大重试次数,避免无限循环 MAX_RETRIES = 5 retry_count = 0 @bot.event async def on_ready(): global retry_count print(f'✅ 机器人已上线:{bot.user.name}') retry_count = 0 # 成功上线后重置重试次数 @bot.event async def on_disconnect(): print('⚠️ 检测到与Discord断开连接,准备重启...') await attempt_restart() async def attempt_restart(): global retry_count retry_count += 1 if retry_count > MAX_RETRIES: print(f'❌ 已达到最大重试次数({MAX_RETRIES}),停止尝试') return try: # 用os.execv重启当前脚本,替换当前进程,避免僵尸进程 python_executable = sys.executable os.execv(python_executable, [python_executable] + sys.argv) except Exception as e: print(f'❌ 重启失败:{str(e)},5分钟后重试...') time.sleep(300) # 等待5分钟 await attempt_restart() # 定时检查连接状态,防止on_disconnect事件未触发 async def connection_monitor(): await bot.wait_until_ready() while not bot.is_closed(): if not bot.is_ready(): print('⚠️ 连接状态检查发现离线,启动重启流程') await attempt_restart() await asyncio.sleep(60) # 每分钟检查一次 # 启动监控任务 bot.loop.create_task(connection_monitor()) # 替换成你的机器人Token bot.run('YOUR_DISCORD_BOT_TOKEN')
2. 系统级守护进程(更可靠的兜底方案)
如果机器人进程本身崩溃(比如代码bug导致退出),上面的内部重启逻辑就失效了。这时候可以用树莓派的systemd来创建守护服务,确保进程崩溃或离线后自动重启:
- 创建systemd服务文件:
sudo nano /etc/systemd/system/discord-bot.service
- 写入以下内容(注意替换路径为你的机器人脚本路径):
[Unit] Description=Discord Bot Service After=network.target # 确保网络启动后再启动机器人 [Service] User=pi # 运行机器人的用户,一般是pi WorkingDirectory=/home/pi/discord-bot # 机器人脚本所在目录 ExecStart=/usr/bin/python3 /home/pi/discord-bot/bot.py # 启动命令 Restart=on-failure # 进程失败时重启 RestartSec=300 # 失败后等待5分钟再重启 StandardOutput=journal+console # 日志输出到系统日志 StandardError=journal+console [Install] WantedBy=multi-user.target
- 启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable discord-bot.service # 设置开机自启 sudo systemctl start discord-bot.service
这样,不管是脚本内部检测到离线,还是进程崩溃,systemd都会自动帮你重启机器人,双重保险。
额外注意事项
- Discord.py版本适配:Python3.6不支持最新版的Discord.py,所以一定要安装
discord.py==1.7.3这个版本,用pip install discord.py==1.7.3安装 - WiFi自动重连:可以优化树莓派的WiFi配置,让系统自动重连WiFi,减少离线情况。比如修改
/etc/wpa_supplicant/wpa_supplicant.conf,添加ap_scan=1,或者用NetworkManager管理网络 - 日志记录:建议添加日志到文件,方便排查问题。可以用Python的
logging模块,把输出写到本地文件里,这样重启前后的日志都能查看
内容的提问来源于stack exchange,提问作者botbotbotty
相关产品推荐
相关产品推荐

