Anaconda环境Discord Bot脚本systemd自启动失败求助
问题:Systemd启动Discord Bot失败,报错
TypeError: expected token to be a str, received <class 'NoneType'> instead 环境配置
- Proxmox平台上的Debian 11服务器
- 创建了拥有sudo权限的mupsje用户
- 在mupsje用户及root账户下安装Anaconda3
- 创建discordbot虚拟环境
- 脚本目录:
/home/mupsje/discordbot/
脚本与代码
编写了赋予执行权限的on_startup.sh脚本:
#!/bin/bash /home/mupsje/anaconda3/envs/discordbot/bin/python /home/mupsje/discordbot/bot.py
bot.py的开头shebang为:
#!/home/mupsje/anaconda3/envs/discordbot/bin/python import blablabla
测试与问题
手动登录mupsje或root账户执行on_startup.sh时,Python脚本可正常运行。但配置systemd服务实现重启自启动后出现异常:
创建discordbot.service文件:
[Unit] Description=Startup Discordbot [Service] ExecStart=/home/mupsje/discordbot/on_startup.sh [Install] WantedBy=multi-user.target
执行sudo systemctl start discordbot.service后查看状态,报错信息如下:
TypeError: expected token to be a str, received <class 'NoneType'> instead
服务启动失败,请问哪里操作有误?
解决思路与方案
这个报错的核心原因是Discord Bot无法获取有效的token,大概率是systemd服务运行时没有加载到必要的环境变量——手动登录终端时会自动加载用户的bashrc/profile环境变量,而systemd默认以最小化环境运行,不会读取这些用户配置。
具体修正步骤:
针对环境变量存储的token
如果你的bot通过os.getenv("DISCORD_TOKEN")这类方式读取token,需要让systemd加载对应的变量:- 编辑
/etc/systemd/system/discordbot.service,补充以下配置:
[Unit] Description=Startup Discordbot [Service] # 指定以mupsje用户运行,避免root权限风险 User=mupsje # 加载虚拟环境的PATH,确保Python命令可被找到 Environment="PATH=/home/mupsje/anaconda3/envs/discordbot/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin" # 直接调用Python脚本,省去shell中间层(更可靠) ExecStart=/home/mupsje/anaconda3/envs/discordbot/bin/python /home/mupsje/discordbot/bot.py # 失败自动重启,提升服务稳定性 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target- 编辑
针对文件存储的token
如果bot从本地文件读取token,检查读取路径是否为绝对路径——手动运行时相对路径可能生效,但systemd默认工作目录是/,必须改成/home/mupsje/discordbot/token.txt这类完整路径。重新加载配置并启动服务
sudo systemctl daemon-reload sudo systemctl restart discordbot.service
额外排查点:
- 检查脚本目录权限,确保mupsje用户有读写权限:
ls -l /home/mupsje/discordbot/ - 查看完整服务日志获取更多细节:
journalctl -u discordbot.service -f
内容的提问来源于stack exchange,提问作者Mupsje
相关产品推荐
相关产品推荐

