Node-cron夜间1点停止运行问题排查求助
定时任务夜间停止、次日API调用恢复的问题分析
你怀疑的服务器夜间停止场景是完全可能的
Phusion Passenger在Plesk环境下默认有空闲进程超时机制:当应用长时间没有收到外部请求(比如夜间无人访问),Passenger会自动停止应用进程以节省服务器资源。当次日第一个API请求进来时,Passenger会重新启动应用实例,你的定时任务也会随应用初始化重新注册,因此恢复运行。
验证方法
- 检查Plesk的应用配置:找到Passenger相关设置里的「Idle process timeout」(空闲进程超时)项,默认值通常在15分钟到1小时区间,若夜间1点后无请求,进程会被触发停止
- 查看应用/服务器日志:夜间1点左右的日志中,若存在Passenger停止进程的记录,或应用进程退出的日志条目,即可确认此问题
其他可能的问题点
- 任务注册逻辑漏洞:确认
start方法是否在Express应用启动时被可靠调用。若应用重启后start未执行,定时任务不会注册,但结合你描述的「首次API调用后恢复」,此可能性较低 - 资源泄漏导致进程被终止:若应用存在内存泄漏,夜间运行一段时间后内存占用过高,可能被系统的OOM Killer强制终止。这种情况日志中会有OOM相关记录,且终止时间不一定固定在1点
- 时区配置偏差:node-cron默认使用系统时区,若服务器时区与预期不符,可能导致任务执行时间显示异常,但不会直接导致任务停止,可通过
console.log(new Date())验证当前时区 - 未捕获的异常:若
chatLog.send调用Telegram API时抛出未捕获的异常,可能导致定时任务终止。可给该调用添加try-catch块,捕获并记录异常,排查是否因API调用失败导致任务停摆
解决建议
- 调整Passenger超时设置:在Plesk应用配置中,将「Idle process timeout」设为
0(表示永不超时),或延长至足够覆盖夜间无请求的时间段 - 改用系统级定时任务:使用Linux原生
cron定时触发任务,比如直接调用你的Express接口,或执行独立的node脚本,完全脱离Passenger的进程管理,可靠性更高 - 添加应用保活机制:定时向自己的API发送心跳请求(比如每10分钟一次),避免Passenger判定应用为空闲状态
内容的提问来源于stack exchange,提问作者red
相关产品推荐
相关产品推荐

