gocron-定时任务管理系统

423 阅读5分钟

背景

运维时间长了,一堆crontab要写,还要处理以下几个问题,贼烦:

  • crontab太多了,每次排查都麻烦。
  • 每个定时任务都得去监控有没有执行成功,要人工去查日志。
  • 每个都得写个预警功能,比如异常就邮件提醒,钉钉群提醒。

那有没有一个可以统一管理crontab,任务异常就自动触发预警(不用每个监控都写预警功能),查看日志也非常友好的工具呢?网上找了一圈,发现gocron就挺不错,轻量简单,该有的功能都有了。

客户端和服务端

客户端用Docker安装,服务器端用方案二安装(就一个执行文件)。

方案一

这种安装网上案例比较少,大多是源码安装。

一、搜索镜像

docker search gocron

二、拉镜像

docker pull ouqg/gocron

查看docker tag hub.docker.com/r/ouqg/gocr…

三、运行镜像

docker run -e TZ="Asia/Shanghai" --restart=always --name gocron -p 5920:5920 -d ouqg/gocron

四、初始化配置、数据库等

默认访问地址:http://127.0.0.1:5920,如果是第一次配置,先创建好数据库,填好数据库配置和管理员账号可直接初始化(表+数据)

主机名肯定不是默认的127.0.0.1,这个是指当前gocron容器的内部地址

img

五、已有数据库,想继续用老数据

有两种方式 1、直接修改配置文件 2、备份数据库,直接初始化数据库后还原数据。

以下是第一种方式

docker exec -it gocron sh

默认情况容器里的app/conf下是空的,需要下图2个文件来初始化配置是数据,也是下面要做的 img

install.lock是一个空文件,直接创建

cd conf && touch install.lock

vi app.ini修改以下数据库信息,复制保存即可,注意auth_secret一定要记得用以前的,错误的话无法手动初始化(做好auth_secret备份)

[default]
db.engine         = mysql
db.host           = 127.0.0.1
db.port           = 3306
db.user           = root
db.password       = password
db.database       = gocron
db.prefix         = 
db.charset        = utf8
db.max.idle.conns = 5
db.max.open.conns = 100
allow_ips         = 
app.name          = 定时任务管理系统
api.key           = 
api.secret        = 
enable_tls        = false
concurrency.queue = 500
auth_secret       = b413cb90e7e1cf8159ef3fec49333faa2b82499052c81ec826c0f8657ac07427
ca_file           = 
cert_file         = 
key_file          = 

修改完成后exit退出容器,docker restart gocron重启容器 再重新打开地址:http://127.0.0.1:5920 就不会默认再跳转初始化数据库页面了,用原数据库账户登录即可

六、gocron的使用

如果只是简单的使用job发一个http已经可以用了,gocron还可以配置节点,暂时没弄 案例0 0 12 * * ? 每天12点触发 img 也可以查看执行日志 img

有记录所有输出

2024-05-22_20-25

七、重置密码

如果忘记密码可用以下sql重置,密码是123456,登录后重新修改

UPDATE gocron.`user` SET password='48a23c508cf968b63c1a58ebac679799',salt='Npqq3a' WHERE name ='admin'

八、定时清理JOB日志

删除3个月以前的JOB日志

DELETE FROM gocron.`task_log` WHERE start_time <=date_add(now(), interval -3 month)

方案二

其实官网的安装说明已经很详细了,我这里在大概的说一下。

1、必须安装go的运行环境。 2、主要gocron是web可视界面,gocron-node是服务器端需要安装的。 3、gocron的默认监听端口5920,gocron-node的默认监听端口 5921。

下载

我们以二进制的方式安装,下载下面的两个包

wget https://github.com/ouqiang/gocron/releases/download/v1.5.3/gocron-node-v1.5.3-linux-amd64.tar.gz
https://github.com/ouqiang/gocron/releases/download/v1.5.3/gocron-v1.5.3-linux-amd64.tar.gz
​

解压

tar -zxvf gocron-node-v1.5.3-linux-amd64.tar.gz -C /home/xj/software/
mv /home/xj/software/gocron-node-linux-amd64/gocron-node /home/xj/software/
​
tar -zxvf gocron-v1.5.3-linux-amd64.tar.gz

运行

启动gocron-node (不能使用root用户,使用后会失败)

sudo chown xj:xj /home/xj/software/gocron-node
​
sudo -u xj ./gocron-v1.5.3-linux-amd64/gocron web
sudo -u xj /home/xj/software/gocron-node
​
./gocron-node

启动程序后需要一直开着运行窗口,不能关掉,一会我们在说解决办法。

此刻你可以直接在浏览器里面访问,http://ip:5920,没有问题的话会打卡运行界面,需要我们输入链接数据库的配置。

img

完成后会跳到登陆页面,输入管理员账号和密码登陆。

任务节点

登陆后最先做的是设置任务节点,任务节点指的就是服务器,若是在哪台服务器跑脚本,就设置好哪一台,需要提前在此服务器安装gocron-node。

img

任务节点完成后,任务管理里面添加定时任务即可,这里的定时任务是精确到秒的,切记,切记!

img

添加完运行的时候,就可以看到日志了,这里不在多介绍,相信你肯定会。

后台运行脚本

创建gocron 和 gocron-node 的shell脚本gocron.sh ,放到你想放的目录,我这里放在 /home/xj/shell 中,注意下面脚本的名字变化。

#!/bin/bash
#启动gocron-node
cd /home/xj/software/
sudo -u xj bash -c 'nohup /home/xj/software/gocron-node > /dev/null 2&1 &'#启动gocron
cd /home/gocron-linux-amd64
sudo -u xj bash -c 'nohup ./gocron > /dev/null 2&1 &'

修改文件权限,run.sh需要可执行权限。

chmod -R 777 gocron.sh

指定文件所在的组

chown -R xj:xj gocron.sh

启动脚本文件

source /home/jxiao/shell/gocron.sh

说明使用source执行的原因:当shell执行脚本的时候,它会开启一个子shell,目录跳转命令只会在这个子shell中执行,并不会影响到父shell。要想在父shell中实现目录的跳转,需要用source来执行脚本。

注意(重要的事说三遍)

  1. 如果是docker安装的,要找到宿主的ip,默认的127.0.0.1是gocron的容器本身
  2. 如果是docker安装的,要找到宿主的ip,默认的127.0.0.1是gocron的容器本身
  3. 如果是docker安装的,要找到宿主的ip,默认的127.0.0.1是gocron的容器本身