如何配置PM2使其在脚本未执行完毕时并发启动新的定时运行实例?
如何配置PM2使其在脚本未执行完毕时并发启动新的定时运行实例?
嘿,我完全懂你碰到的这个问题!PM2默认的定时任务逻辑就是这么“霸道”——到了定时时间,不管前一个脚本实例有没有跑完,它都会直接杀掉旧进程再启动新的,这也是你看到日志突然中断的原因。要让它允许并发启动新实例,咱们可以用下面这两种靠谱的方法解决:
方法一:用PM2配置文件开启并发定时模式
最规范的方式是创建一个PM2的生态配置文件,明确告诉它每次定时触发时要启动新进程,而非替换旧的。
新建一个名为ecosystem.config.js的文件,写入以下内容:
module.exports = { apps: [ { name: "my-script-scheduler", script: "./my-script.js", cron_restart: "* * * * *", // 保持你原来的每分钟执行的 cron 表达式 exec_mode: "fork", // 采用fork模式,每个实例都是独立的进程 instances: 1, // 基础实例数,不影响定时新增的实例 wait_ready: false, // 不需要等待脚本就绪再触发下一次 kill_timeout: 0, // 禁止PM2主动杀掉正在运行的实例 autorestart: false, // 关闭自动重启,只靠cron触发新实例 } ] };
然后用这个配置启动任务:
pm2 start ecosystem.config.js
这样设置后,每到整点分钟,PM2就会启动一个全新的my-script.js实例,之前的实例会正常运行到自己结束,完全不会被中断。
方法二:系统定时任务+PM2启动唯一命名实例
如果觉得配置文件太麻烦,也可以直接借助系统的定时工具,每次触发时让PM2启动一个带唯一名称的实例——因为PM2只会对同名进程做替换操作,不同名称的进程会被当成独立个体管理。
比如在Linux/macOS的crontab里添加这条命令:
* * * * * pm2 start my-script.js --name "my-script-$(date +%s)"
这里的$(date +%s)会生成当前时间戳作为实例名称后缀,保证每个实例的名字都独一无二,PM2就不会去干扰正在运行的旧实例了。
验证配置是否生效
设置完成后,你可以用pm2 list查看进程列表,每分钟都会新增一个my-script相关的实例,旧实例会显示为online直到脚本执行完毕变为stopped。同时用pm2 logs查看日志,每个实例的日志都会完整输出,不会再出现中途中断的情况。
备注:内容来源于stack exchange,提问作者LiteralMetaphore
相关产品推荐
相关产品推荐

