cron 用法
我們來看乙個小的demo:每隔一秒列印"hello world"
)func main() ) // 給物件增加定時任務
c.start()
select {}
}這個小功能用time.ticker也可以實現,我們為什麼要使用cron來完成呢?別急接著往下面看就知道了。
cron表示式
我們在上面demo中使用了addfunc,第乙個引數我們傳遞了乙個字串是:"* * * * * *",這六個*是指什麼呢?
┌─────────────second 範圍 (0 - 60)
│ ┌───────────── min (0 - 59)
│ │ ┌────────────── hour (0 - 23)
│ │ │ ┌─────────────── day of month (1 - 31)
│ │ │ │ ┌──────────────── month (1 - 12)
│ │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are sunday to
│ │ │ │ │ │ saturday)
│ │ │ │ │ │
│ │ │ │ │ │
* * * * * *
匹配符號
example
比如我們的手機卡假設都是在每個月的開始時間就更新資費:
"0 0 0 1 * *" // 表示每個月1號的00:00:00
"0 1 1 1 * *" // 表示每個月1號的01:01:00
每隔5秒執行一次:"*/5 * * * * ?"
每隔1分鐘執行一次:"0 */1 * * * ?"
每天23點執行一次:"0 0 23 * * ?"
每天凌晨1點執行一次:"0 0 1 * * ?"
每月1號凌晨1點執行一次:"0 0 1 1 * ?"
在26分、29分、33分執行一次:"0 26,29,33 * * * ?"
每天的0點、13點、18點、21點都執行一次:"0 0 0,13,18,21 * * ?"
pre-defined schedules
github.com/robfig/cron 包還給我門提供了一些預定義的模式:
entry
description
equivalent to
@yearly (or @annually)
run once a year, midnight, jan. 1st
0 0 0 1 1 *
@monthly
run once a month, midnight, first of month
0 0 0 1 * *
@weekly
run once a week, midnight between sat/sun
0 0 0 * * 0
@daily (or @midnight)
run once a day, midnight
0 0 0 * * *
@hourly
run once an hour, beginning of hour
0 0 * * * *
@every
every duration
c.addfunc("@every 1h30m", func() )
golang cron主要的設計思路
主要型別或介面說明 (借用大佬)
type cron struct // 控制 cron 例項暫停
add chan *entry // 當 cron 已經執行了,增加新的 entity 是通過 add 這個 channel 實現的
snapshot chan *entry // 獲取當前所有 entity 的快照
running bool // 當已經執行時為true;否則為false
}注意,cron 結構沒有匯出任何成員。
注意:有乙個成員 stop,型別是 struct{},即空結構體。
type entry struct
type job inte***ce
由於 entity 中需要 job 型別,因此,我們希望定期執行的任務,就需要實現 job 介面。同時,由於 job 介面只有乙個無引數無返回值的方法,為了使用方便,作者提供了乙個型別:
type funcjob func()
它通過簡單的實現 run() 方法來實現 job 介面:
func (f funcjob) run()
這樣,任何無引數無返回值的函式,通過強制型別轉換為 funcjob,就可以當作 job 來使用了,addfunc 方法 就是這麼做的。
type schedule inte***ce
schedule 的具體實現通過解析 cron 表示式得到。
庫中提供了 schedule 的兩個具體實現,分別是 specschedule 和 constantdelayschedule。
① specschedule
type specschedule struct
從開始介紹的 cron 表示式可以容易得知各個欄位的意思,同時,對各種表示式的解析也會最終得到乙個 specschedule 的例項。庫中的 parse 返回的其實就是 specschedule 的例項(當然也就實現了 schedule 介面)。
② constantdelayschedule
type constantdelayschedule struct
這是乙個簡單的迴圈排程器,如:每 5 分鐘。注意,最小單位是秒,不能比秒還小,比如 毫秒。
通過 every 函式可以獲取該型別的例項,如:
constdelayschedule := every(5e9)
得到的是乙個每 5 秒執行一次的排程器。
函式呼叫
func new() *cron ),
snapshot: make(chan *entry),
running: false,}}
可見例項化時,成員使用的基本是預設值;
② 解析 cron 表示式
func parse(spec string) (_ schedule, err error)
spec 可以是:
② 成員方法
// 將 job 加入 cron 中
// 如上所述,該方法只是簡單的通過 funcjob 型別強制轉換 cmd,然後呼叫 addjob 方法
func (c *cron) addfunc(spec string, cmd func()) error
// 將 job 加入 cron 中
// 通過 parse 函式解析 cron 表示式 spec 的到排程器例項(schedule),之後呼叫 c.schedule 方法
func (c *cron) addjob(spec string, cmd job) error
// 獲取當前 cron 總所有 entities 的快照
func (c *cron) entries() *entry
// 通過兩個引數例項化乙個 entity,然後加入當前 cron 中
// 注意:如果當前 cron 未執行,則直接將該 entity 加入 cron 中;
// 否則,通過 add 這個成員 channel 將 entity 加入正在執行的 cron 中
func (c *cron) schedule(schedule schedule, cmd job)
// 新啟動乙個 goroutine 執行當前 cron
func (c *cron) start()
// 通過給 stop 成員傳送乙個 struct{}{} 來停止當前 cron,同時將 running 置為 false
// 從這裡知道,stop 只是通知 cron 停止,因此往 channel 發乙個值即可,而不關心值是多少
// 所以,成員 stop 定義為空 struct
func (c *cron) stop()
如果對每個方法呼叫還是不了解可以去看一下每隔函式的實現原始碼
example:
)type hello struct
func (h hello) run()
func main()
// 新增定時任務
c.addjob("*/2 * * * * * ", h)
// 新增定時任務
c.addfunc("*/5 * * * * * ", func() )
s, err := cron.parse("*/3 * * * * *")
if err != nil
h2 := hello
c.schedule(s, h2)
// 其中任務
c.start()
// 關閉任務
defer c.stop()
select {}
}
linux定時任務 at定時任務
at命令是一次性定時計畫任務,at的守護程序atd會以後臺模式執行,檢查作業佇列來執行作業。atd守護程序會檢查系統上的乙個特殊目錄來獲取at命令的提交的作業,預設情況下,atd守護程序每60秒檢查一次目錄,有作業時,會檢查作業執行時間,如果時間與當前時間匹配,則執行此作業。注意 at命令是一次性定...
at定時任務
at的守護程序每60秒檢查一次作業佇列,有作業時檢查作業,時間恰好達到,則執行作業。前提 保證atd程序已經啟動,檢查atd程序是否啟動 ps ef grep atd。atd的命令格式 at 選項 時間 ctrl d 結束at命令的輸入。選項 m 任務完成後給使用者傳送郵件,沒有標準輸出。i atg...
at定時任務
1 at是只執行一次,執行完後任務刪除。at的守護程序atd會以後臺模式執行,檢查作業佇列來執行。2 預設 atd每60秒巡邏一次,有作業時候,檢查作業時間,如果和當前時間一樣,就執行任務 3 在使用at命令的時候,一定要保證他的守護者atd程序的啟動。用ps ef grep atd來檢視atd是否...