# cron-task **Repository Path**: mysoft-free/cron-task ## Basic Information - **Project Name**: cron-task - **Description**: 基于crontab的task作业 - **Primary Language**: Go - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-04-14 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # cron-task #### 介绍 基于Unix Cron时间格式的计划任务 任务具备如下特征: 1、支持秒级别定时任务,可按照unix cron时间格式设定任务计划时间 2、单次计划任务支持设定并发实例,当所有实例结束任务才算完成,并退出 3、可设置任务的执行前后计划是否排他,即本次计划未完成,新计划不能开始,可等待或选择失败退出 #### 配置及使用说明 ##### 构建自己的toml配置文件 ``` [system] [httpServer] listenAddr = ":9091" #http服务启动的监听地址 storage = "redis" #local为本地存储map,redis为分布式存储,关联redis配置 [authorize] mode = "none" # none - 不开启校验,file -文件模式,读取下面的users列表 authKey = "mysoft" #默认授权key users = ["yangzhen22:111","li4:abc"] #格式说明 `name:password:authkey`,如果只有`name:password`则authkey为默认 #排他锁设置,配合exclusive = true使用 [locker] lockerType = "redis" # mutex-内存互斥锁,channel-内存互斥锁支持可控锁等待,redis - 分布式锁支持可控锁等待 lockerWait = false #锁等待,false则表示加锁失败则返回,对于mutex无效 #当且仅当lockerType = redis有效 [redis] addr = "127.0.0.1:6379" password = "" db = 0 #任务设置 [tasks] [tasks.test1] taskType = 1 #1为命令行,2为http请求 cron = "0 */1 * * * *" # 支持unix crontab格式 instances = 5 # 任务运行时支持的并行实例 exclusive = true #是否排他任务,开启排他锁则同一类任务执行是排他的 name = "test1" runEnv = "php56" #运行环境,这里是指运行 path = "/Users/yangzhen/Desktop/PHP_CODE/apps/yii" args = ["test/cron"] ``` ##### 配置参数说明 |参数 |说明 |备注| |-----|:----|:----:| |system|全局配置|---| |locker|锁配置|--| |redis|redis配置|--| |tasks|任务节点配置| ---| ###### 备注: tasks节点说明 |参数 |说明 |备注| |-----|:----|:----:| |taskType|任务类型|1-命令行模式,2-Http模式(暂未开放)| |cron|计划时间| 格式如:*/1 * * * * *| |instances|并发实例|当次计划任务执行时,可设置并发实例数| |exclusive|是否排他|前后两次计划任务可设置排他性| |name|任务名称|设定任务执行的名字,可重复 |runEnv|运行环境|如php,/usr/local/bin/php,命令行可执行程序| |path|执行路径|如/webser/www/apps/yii| |args|运行参数集合| ["test/cron"] | ``` 补充说明: 1、关于设置instances 设置该值影响的是当前计划任务开启的并发进程数,最终将开启协程等待直至所有协程结束,当前计划才会退出。也就是说这个是单机的 物理行为,和分布式并发意义不同; 2、关于设置exclusive排他属性 存在这样的场景,计划任务的执行是需要保持唯一性,即需要某次执行前加锁,执行完后解锁,临近的下次开始前会先检查锁,如果锁存 在则不执行。这里等待结束下次执行,有两种策略: 1、检查加锁失败,立刻返回,结束计划开始的新任务; 2、加锁失败,立刻执行"锁等待",即当前计划并未结束,只是在排队等待机会; 锁等待的优劣: 优点:等待锁的计划任务,会在解锁第一时间抢锁然后立刻执行,与立即返回的计划任务相比,任务执行会更紧凑; 缺点:锁等待会导致大量的计划任务无法顺利执行而排队,造成系统消耗,必须保证锁等待只能有且仅有一个等待,其余抛弃机制; 3、关于runEnv,path,args的使用说明 当前计划任务是命令行模式时(taskType=1),runEnv为当前应用程序的可执行命令,如php类型脚本肯定就是php的系统命令运行位置, path为需要执行的脚本位置,args则是运行脚本需要的参数列表,以PHP的YII框架为例,我们设置如下: /usr/local/bin/php /webser/www/apps/yii test/cron 对应的 三个参数为 runEnv=/usr/local/bin/php ,path=/webser/www/apps/yii, args=["test/cron"] ``` ### 启动说明 ``` 单独启动主程序启动附带参数 -h 参数说明 -c 配置路径 ,使用如 -c="/tmp/config.toml" 借助monitor.sh脚本启动 bash monitor.sh (start|stop|reload|restart) start 启动服务 stop 停止服务,需要再次输入确认 0 为立刻停止,可能会破坏正在执行的计划任务;1 等待退出,当且仅当所有已经在运行的计划结束, 主程序才退出 reload|restart 先stop,再start,注意stop是选择1的前提下,这种是非暴力重启 注意,vi打开sh文件,根据实际情况修改如下三行 execFile=$(pwd)/cron ,当前编译的文件名,默认是写当前sh同级目录。 logPath=$(pwd)/cron.log , 服务程序console输出的日志存放地儿,建议选择/tmp下。 configPath=$(pwd)/config.toml ,启动需要配置文件地址,这里可以先填写。 配置完上面的内容,则可以每次直接修改config.toml内容再reload|restart即可 ```