几天前用 Python 写的统计代码提交情况的小程序基本就绪后,需要让它定时执行。最简单实用的方法是系统自己的 cron 来调度。
由于业务上后端已经有 go 的服务在线上,所以考虑看一下这个流派里,对于服务治理有没有什么现成的工具可以用。入门的需求有两个:
1. 定时执行;
2. 对启动、停止、异常等的值守。
前者选出一个名为 gocron 的项目(https://github.com/ouqiang/gocron)。在结构上,gocron 分为两个部分,一个是控制管理中心,一个是任务执行节点,即使在同一台设备上,这两者也是分离的。
gocron 依赖 MySQL 数据库,所以在投入使用前要准备一下。命令行下执行 gocron web
即可,此时会默认监听于 5920
端口,如果要从其他设备远程访问的话,记得 iptables -I INPUT -p tcp --dport 5920 -j ACCEPT
把端口放开。用浏览器通过 ip:port 访问,第一次进入显然要把数据库什么的配置好。接着再开展配置用户、增加节点、添加定时任务等工作。
它的定时设置采用 cron 语法,可以精确到秒。我希望每天晚上九点半执行一次任务,配了个 0 30 21 * * */1
,最后那个 /1
是多此一举,只不过为了提醒我测试阶段结束后要改一下,改成一周一次即可。对 crontab
的时间周期表达格式不熟练的可以去 https://tool.lu/crontab 检测结果。
执行节点的启动,命令行 gocron-node
就够了,默认监听于 5921
。
接下来需要一个保证它们可以一直在工作的守护者。由于之前用过业内知名的 supervisor
,又出于想多接触一下 go 的应用,选择了 go 语言版的 supervisord
,项目地址为 https://github.com/ochinchina/supervisord。这个项目没有预编译好的 binary 可用,只好把代码 clone 到本地(恰好服务器上竟然原来有 go 的开发工具链什么的),直接 go build
就顺利通过了。
supervisord
的命令行参数一看是很简单的,想让它跑起来的话,supervisord -c configfile
就可以,如果想让它以 Daemon 的方式运行,加个 -d
参数就好。在此认知的基础上,我的配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[supervisord] logfile=/srv/supervisor/supervisord.log logfile_maxbytes=50MB logfile_backups=10 loglevel=debug pidfile=/tmp/supervisord.pid [inet_http_server] port=127.0.0.1:9090 [program:gocron] command = /srv/gocron/centre/gocron web [program:gocron-node] command = /srv/gocron/node/gocron-node user = dummy |
执行起来后服务的效果是没有大问题的,但后续用命令行查询服务状态时发现,所有的命令都不能正确响应。supervisord ctl status
无输出,supervisord ctl pid processname
则都是返回 0
。
至此踏入郁闷的远程调试之途,其中曲折容后再总结,到最后的结论是,上述这些控制命令均需后附额外的服务地址参数,针对前面的配置文件,具体参数就是 -s http://127.0.0.1:9090
或者 -s http://localhost:9090
。