Skip to content

Instantly share code, notes, and snippets.

@bydmm
Last active October 18, 2022 09:59
Show Gist options
  • Save bydmm/0d055149f1bec77df1f791f1dc75730e to your computer and use it in GitHub Desktop.
Save bydmm/0d055149f1bec77df1f791f1dc75730e to your computer and use it in GitHub Desktop.
PM2任务管理器用作定时任务的心得

PM2是一款用nodejs实现的进程管理器,本身功能比较强大,在CLI下的指令都比较好用。 PM2可将各种各样的程序维持在后台,不仅仅是nodejs,还可以是ruby,python,java等。其主要使用方法是编写一个描述文件,来描述PM2如何运行你想要的程序。

http://pm2.keymetrics.io/docs/usage/application-declaration/

可惜PM2本身是一款针对持续后台任务'deamon'而设计的管理器,对运行一次就要退出的‘task’不是很友好,所以特写此文纪念逝去的时光。

想让PM2帮你跑定时任务的话,有以下两种两种方法。这两种方法各有利弊,请自行取舍。

一, 自动重启法

如果你想要跑的程序只关注运行时间的间隔,而不关注精确地开始时间,那么请用这种办法.

# cocoapods.json
{
  "name": "cocoapods-specs", #任务名称
  "script": "cocoapods.rb", #后台任务的脚本位置
  "exec_interpreter": "ruby", #用什么去执行,这里是ruby cocoapods.rb
  "cwd": "/pathsource/pm2_jobs/cocoapods", #程序根路径,我猜PM2会首先CD到这个目录,然后运行上面的命令。业务程序的的相对路径也从这里开始算
  "restart_delay": 600000 # 这里是重点,这是自动重启的时间, 单位是毫秒
}

这里的程序会每10分钟运行一次,然后程序就退出了。然后10分钟后自动重启。这个的缺点是你无法指定特定的时间去跑, 比如凌晨1点开始运行。优点是任务完成后会退出,不会占用内存。

二, crontab辅助法。

如果你就是想在特定的时间去运行这个程序,那么这是我想出的一个变通方法。

首先你需要一个描述文件

# databases_bk.json
{
  "name": "databases_bk",
  "script": "databases_bk.rb",
  "exec_interpreter": "ruby",
  "cwd": "/pathsource/pm2_jobs/databases_async",
  "watch": ["restart"] # 重点在这里,我让pm2去监控了一个叫做restart的文件,如果文件变化,就会重启进程
}

然后你的业务文件可能需要这么写

# databases_bk.rb

something_todo()

# 死循环来驻留内存, try catch是为了退出的时候不抛出异常
while true
  begin
  sleep 999
  rescue Exception => e
    exit
  end
end

最后还要在crontab里添加定时任务

$crontab -e

# Edit this file to introduce tasks to be run by cron.
0 1 * * * touch /pathsource/pm2_jobs/databases_async/restart # 这里touch一下restart这个文件就会触发上面重启

这样你就可以每天凌晨1点的时候跑一次了,缺点是需要驻留消耗一些内存。

三, 我看文档里明明有cron_restart这个配置项目啊!

无论是否主流内存,这个配置项对我的程序都没有生效,暂时还没弄明白这个配置项到底如何使用.

@royalrover
Copy link

第二种方式通过死循环,应该很浪费cpu吧。node-schedule可以帮助你实现这个功能,没必要用这么hack的方式做

@CosPie
Copy link

CosPie commented Aug 13, 2020

cron_restart 配置项仅支持 cluster 模式的应用,如果你配置了没有生效,可以 pm2 list 看一下mode一列是否为 fork

@wuzhitian
Copy link

restartDelay - (Default: 0) Number of millseconds to wait before restarting a script that has exited.
第一种就错了,restart_delay 是指脚本停止后,延迟多少时间再执行.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment