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

如何使用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来创建守护服务,确保进程崩溃或离线后自动重启:

  1. 创建systemd服务文件:
sudo nano /etc/systemd/system/discord-bot.service
  1. 写入以下内容(注意替换路径为你的机器人脚本路径):
[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
  1. 启用并启动服务:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:02:42