如何用PM2每10分钟运行Bash脚本?解决cron_restart触发异常
解决PM2定时执行脚本的两个常见问题
让我来帮你搞定这两个PM2使用中的实际问题,都是我自己踩过的坑:
一、用PM2每10分钟运行Bash脚本
PM2本身支持定时任务,但很多人会搞混cron_restart和真正的定时触发配置。正确的做法是使用PM2的定时任务触发功能,而不是重启进程的配置:
命令行快速启动:
直接用--cron参数指定执行间隔,每10分钟运行一次的话:pm2 start your_script.sh --cron "*/10 * * * *" --name "timed-script"记得先给脚本加执行权限:
chmod +x your_script.sh配置文件方式(更适合复杂场景):
创建ecosystem.config.js,写入以下内容:module.exports = { apps: [ { name: "timed-script", script: "./your_script.sh", cron: "*/10 * * * *", // 每10分钟执行一次 autorestart: false, // 关键:执行完就结束,不要自动重启 watch: false } ] };然后用
pm2 start ecosystem.config.js启动即可。
二、解决cron_restart导致脚本频繁重启的异常
你遇到的问题核心是误解了cron_restart的作用:
cron_restart的功能是「定时重启正在运行的进程」,而不是「定时触发脚本执行」
当你的脚本(比如date >> time.log && sleep 5)执行5秒后就结束了,PM2会默认认为进程异常退出,然后按照它的自动重启策略(默认是always)立刻重启这个脚本,导致一分钟内重复执行N次,完全不符合你的预期。
解决方案:替换为真正的定时任务配置
把原来的cron_restart换成cron字段,并且关闭自动重启:
修改你的PM2配置,比如:
module.exports = { apps: [ { name: "minute-script", script: "./your_script.sh", cron: "* * * * *", // 每分钟触发一次执行 autorestart: false, // 执行完毕后不自动重启 watch: false } ] };
这样配置后,PM2会严格按照cron表达式的时间点触发脚本执行,执行完就结束,直到下一个时间点再运行,完美解决频繁重启的问题。
验证方式
用pm2 logs minute-script查看日志,你会看到脚本每分钟只执行一次,不会出现连续重启的情况。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

