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这个配置项目啊!
无论是否主流内存,这个配置项对我的程序都没有生效,暂时还没弄明白这个配置项到底如何使用.
第二种方式通过死循环,应该很浪费cpu吧。node-schedule可以帮助你实现这个功能,没必要用这么hack的方式做