如何通过Crontab启动多实例PM2并实现开机自启
如何通过Crontab启动多实例PM2并实现开机自启
我碰到过类似的问题,crontab运行PM2多实例失败大多是环境变量不匹配或者路径问题导致的——毕竟crontab的执行环境和你手动在CLI里跑的环境完全不一样。咱们一步步来解决:
第一步:修复你的启动脚本(myscript.sh)
首先把脚本里所有的相对路径改成绝对路径,crontab默认的工作目录不是你的项目目录,相对路径会直接失效。修改后的脚本大概是这样:
#!/bin/bash # 先切换到项目的绝对路径,别用~,直接写全路径 cd /home/user/myproject # 给每个PM2_HOME指定绝对路径,避免相对路径出错 PM2_HOME='/home/user/myproject/.pm2_1' /usr/local/bin/node /usr/local/lib/node_modules/pm2/bin/pm2 start dist/app.js -- id=1 token=xxx isMaster=true PM2_HOME='/home/user/myproject/.pm2_2' /usr/local/bin/node /usr/local/lib/node_modules/pm2/bin/pm2 start dist/app.js -- id=1 token=yyy isMaster=false # 其他实例同理,都用绝对路径 PM2_HOME='/home/user/myproject/.pm2_x' /usr/local/bin/node /usr/local/lib/node_modules/pm2/bin/pm2 start dist/app.js -- id=1 token=zzz isMaster=false
然后给脚本加上执行权限,不然crontab没法跑:
chmod +x /home/user/myproject/myscript.sh
第二步:调整Crontab的配置
crontab的PATH环境变量比你手动CLI的要窄很多,而且@reboot的时候系统可能还没完全就绪(比如网络、文件系统),所以要做这几个调整:
- 先编辑crontab:
crontab -e
- 添加测试用的定时任务(先每分钟跑一次,确认没问题再换开机自启),同时把输出日志写到文件里,方便排查错误:
* * * * * /bin/bash /home/user/myproject/myscript.sh >> /home/user/myproject/cron_pm2.log 2>&1
- 开机自启的话,加个延迟(比如30秒),避免系统还没准备好就启动:
@reboot sleep 30 && /bin/bash /home/user/myproject/myscript.sh >> /home/user/myproject/cron_pm2_reboot.log 2>&1
第三步:排查可能的问题
如果还是不行,去看日志文件cron_pm2.log,常见的问题有:
- command not found:说明crontab找不到node或者pm2的路径,那就在脚本开头加上环境变量配置:
#!/bin/bash # 把node和pm2所在的路径加到PATH里 export PATH=/usr/local/bin:$PATH export NODE_PATH=/usr/local/lib/node_modules # 后面的cd和启动命令...
- PM2实例没启动:检查PM2_HOME的绝对路径是否正确,有没有读写权限。
关于pm2 startup的问题
你说的没错,pm2 startup确实只支持单个PM2_HOME的场景,没法同时管理多个独立的PM2实例目录,所以放弃用它,直接用crontab的@reboot来处理开机自启是最靠谱的方案。
备注:内容来源于stack exchange,提问作者Rougher
相关产品推荐
相关产品推荐

