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

Python Telegram Bot长期运行时如何刷新当前日期?

问题解决指南

核心根因说明

  • date.today() 本身不存在驻留进程的日期缓存,每次调用都会实时读取服务器系统时间生成新的日期对象,不会因为进程长期运行就固定返回启动当天的日期。
  • 你遇到的所有“日期不更新、重启无效、手动跑脚本才正常”的现象,本质来自两个常见的代码/配置问题:
    1. 代码层面把today = date.today()写在了全局作用域,也就是Python模块被加载、进程启动时就执行一次日期赋值,这个全局变量的值会一直固定,不会随时间自动更新。这种写法和supervisor托管无关,哪怕你跑裸进程,只要不重启就永远拿到启动当天的日期;哪怕你定时重启进程,只要启动后跨天了,全局变量还是会固定成启动时刻的日期,完全达不到每日更新的效果。
    2. Supervisor配置存在缺陷,导致执行restart命令时旧的Python进程没有被完全终止,新进程根本没有正常拉起,一直在运行加载了旧全局变量的老进程。

无需重启进程的日期更新方案

根本不需要为了刷新日期重启进程,只需要调整代码的赋值位置,把日期获取逻辑放到实际使用的回调函数内部即可:

  • 把全局位置的today = date.today()删除,不要在模块加载阶段做日期计算
  • 在每次需要用到当日日期的函数内部实时调用date.today(),就像你现在代码里get_today_meditation的写法一样:
def get_today_meditation(update, context):
    chat_id = update.message.chat_id
    # 每次用户触发指令时实时取当前日期,无任何缓存
    today = date.today()
    print(today)
    # 后续业务逻辑...
  • 如果Bot里用到了每日定时推送等场景,同理也要把date.today()的调用写在定时任务的触发回调内部,不要在Bot启动时预先计算好日期存入全局变量。
    按这个写法调整后,Bot进程可以连续运行几个月都不会出现日期不更新的问题,完全不需要定期重启。

Supervisor托管的重启排坑指南

如果你确实有定期重启Bot清理内存的需求,按以下步骤调整配置,就能保证重启后正常加载最新代码:

  • 检查supervisor配置文件中对应Bot程序的command路径,确认指向的是你正在修改的脚本绝对路径,没有因为路径错误指向其他旧版本脚本
  • 在对应程序的配置段增加进程退出等待时间,避免旧进程没完全退出就拉新进程:
[program:telegram_bot]
command=/usr/bin/python3 /your/path/myfile.py
# 给Python进程10秒的时间完成清理、退出
stopwaitsecs = 10
user=www-data
autostart=true
autorestart=true
  • 执行supervisorctl status确认进程的启动时间,验证每次执行restart命令后进程确实是新拉起的,没有出现旧进程残留的问题
  • 如果需要用crontab定时重启,不需要执行supervisorctl restart all避免影响其他托管进程,单独指定重启对应的Bot程序即可:
# 每天凌晨0点5分重启Bot程序,程序名替换为你在supervisor配置里定义的program名
5 0 * * * /usr/bin/supervisorctl restart telegram_bot
  • 最后排查服务器系统时间:手动在终端执行date命令确认系统时间准确,没有时区配置错误、NTP同步失效导致的时间滞后问题。

内容的提问来源于stack exchange,提问作者Guilherme do Valle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 23:15:02