基于GO语言实现分布式定时任务学习(一)----cmd 指令 、cron 、
cmd 基础入门:
-
cmd case1:运行一个简单的cmd指令;
在上述代码中,执行shell交互并且得到了结果,呢么本质是怎么样的呢?
- 任务提交到golang程序;
- golang会向linux申请pipe资源,供数据传输;
- golang通过fork子进程,
- 子进程将标准输入、标准输出、错误输出写入到pipe里面。
- 子进程基于golang代码进行逻辑控制,比如执行bash命令。
- 子进程将结果输入到pipe中
- 又因为pipe一段连接golang程序,所以golang可以得到pipe的输出结果。
- bash执行完毕,子进程退出,golang回收子进程资源。
-
cmd case2:
创建一个子协程,做两秒休眠后打印信息。但在第一秒休眠后将其中断。
context中具有一个channel ,通过cancelFunc对该channel进行了关闭行为,select {case <- ctx.done } 监听到后,kill掉相关的子进程pid;
在上述代码基础下,使其可以做到子进程的结果告知主进程:
Cron 表达式
| * | * | * | * | * |
|---|---|---|---|---|
| 分 | 时 | 日 | 月 | 星期 |
每个*代表的意思是每X;
- 每隔5分钟执行一次: */5 * * * * echo hello > /tmp/x.log ,具体是指每个5分钟的时刻进行一次执行。
- 第1-5分钟执行5次 : 1-5 * * * * echo hello > xxxx ,具体指每个1、2、3、4、5分钟进行一次执行。
- 每天的10点,22点执行一次: 0 10,22 * * * echo bye | tail -1
在上述的定时任务中,指代每30分钟执行。
我们可以基于这样的cron表达式,形成 分钟、小时、日期、月份的枚举。
因为每30分钟执行一次,所以分钟的枚举只有一项 是30 ;
而小时、日、月 在*指代每一的情况下,枚举中包含所有的自然值;
如当前时间是 40分钟 , 10 小时 , 27 日。
- 时间从大到小进行判断,比如10小时,在对应的范围内,下来进行判定分;
- 呢么分钟不在对应的枚举范围内,小时需要进到下一位枚举,既11点,需补时间20分钟;
- 此时时间为 00分,11小时,27日。
- 呢么分钟不在对应的枚举范围内,下一个枚举时间为30分钟,当所有时间都符合枚举的时候,说明cron符合。