本篇不是讲如何处理代码内的定时任务,而是聊聊怎么借助 crontab 等工具,定时操作 pm2 (指令)。例如,定时重启 pm2 中的进程、定时执行 pm2 save 保存运行状态,等等。
重启进程
pm2 --help
可以看到 pm2 自带 cron 功能,但功能仅限于重启进程。
1 | Usage: pm2 [cmd] app |
执行指令
执行指令包括重启 pm2 内的进程,并且可以定时调用 pm2 做任何它支持的事。这种情况下,使用系统层面的 crontab
就对啦。
需要注意的是,pm2 在 crontab 中的运行 PATH 和 在 命令行 shell 中直接执行并不一样,因此会报 pm2: command not found
之类的错。
1 | # 错误示范 |
解决方法是在使用pm2的脚本中指定环境变量,参考which pm2
,找出pm2的bin路径。
一般是通过npm i pm2 -g
全局安装,环境变量是/urs/local/node/bin
。如果你使用nvm,那可能是/home/yourname/.nvm/versions/node/vX.X.X/bin
。
举例
pm2 flush
例如我们要定时清除 pm2 的 log 文件,节省磁盘空间,可以使用 pm2 自带的 flush 命令。
直接执行
一种是直接在定时器执行 pm2 flush
PATH 的指定要结合具体情况,常见的做法是命令行
echo $PATH
,把输出内容补到指令的 PATH 中
1 | SHELL=/bin/sh |
间接执行
另一种是定时调用任务脚本,通过脚本间接执行 pm2 flush,这样方便我们同时做其他处理,如删除日志前先打包备份。
在 crontab 中,内容如下
1 | SHELL=/bin/sh |
再来看它执行的 pm2flush.sh
文件
1 | # 如果crontab中不指定node bin的PATH,也可以在这里通过如下方式指定 |