使用UptimeRobot托管Python Discord Bot时JSON文件数据未更新如何解决?
Replit 部署 Discord Bot 被 UptimeRobot 唤醒后 JSON 数据不更新解决方案
核心原因
Replit 被 UptimeRobot 唤醒的运行实例和手动在控制台启动的实例存在两处核心差异:
- 进程默认工作目录不同,使用相对路径寻址会指向错误位置
- 唤醒后的实例调度优先级较低,未刷入磁盘的缓存数据会在进程临时挂起时丢失
修复步骤
- 替换相对路径为绝对路径,同时增加强制刷盘逻辑,避免缓存写入丢失
import os import json # 获取当前脚本所在目录的绝对路径 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) DATA_PATH = os.path.join(BASE_DIR, "data.json") # 替换原有写入逻辑 with open(DATA_PATH, "w", encoding="utf-8") as file: # 直接使用json.dump写入,等价于原有write+json.dumps的写法 json.dump(data, file, ensure_ascii=False) # 强制清空文件缓存 file.flush() # 强制将缓存数据写入磁盘 os.fsync(file.fileno())
检查保活服务运行架构
确保 UptimeRobot 监听的 Web 保活服务和 Discord Bot 运行在同一个进程、同一个事件循环内,避免多进程部署导致内存中的用户数据不共享,写入非最新数据。增加异常捕获逻辑定位问题
如果上述修改后仍有问题,新增异常捕获代码,在 Replit 控制台查看具体报错信息:
try: with open(DATA_PATH, "w", encoding="utf-8") as file: json.dump(data, file, ensure_ascii=False) file.flush() os.fsync(file.fileno()) except Exception as e: print(f"数据写入失败: {str(e)}")
- 确认数据文件存储位置
不要将data.json存放在/tmp等系统临时目录下,该目录内容会在实例休眠后被清空,导致写入的数据丢失。
内容的提问来源于stack exchange,提问作者Omkaar
相关产品推荐
相关产品推荐

