Go語言版crontab
1、cron 表示式的基本格式
用過 linux 的應該對 cron 有所瞭解。linux 中可以通過 crontab -e 來配置定時任務。不過,linux 中的 cron 只能精確到分鐘。而我們這裡要討論的 Go 實現的 cron 可以精確到秒,除了這點比較大的區別外,cron 表示式的基本語法是類似的。(如果使用過 Java 中的 Quartz,對 cron 表示式應該比較瞭解,而且它和這裡我們將要討論的 Go 版 cron 很像,也都精確到秒)
cron(計劃任務),顧名思義,按照約定的時間,定時的執行特定的任務(job)。cron 表示式 表達了這種約定。
cron 表示式代表了一個時間集合,使用 6 個空格分隔的欄位表示。
欄位名 | 是否必須 | 允許的值 | 允許的特定字元 |
秒(Seconds) | 是 | 0-59 | * / , - |
分(Minutes) | 是 | 0-59 | * / , - |
時(Hours) | 是 | 0-23 | * / , - |
日(Day of month) | 是 | 1-31 | * / , – ? |
月(Month) | 是 | 1-12 or JAN-DEC | * / , - |
星期(Day of week) | 否 | 0-6 or SUM-SAT | * / , – ? |
注:
1)月(Month)和星期(Day of week)欄位的值不區分大小寫,如:SUN、Sun 和 sun 是一樣的。
2)星期
(Day of week)欄位如果沒提供,相當於是 *
2、特殊字元說明
1)星號(*)
表示 cron 表示式能匹配該欄位的所有值。如在第5個欄位使用星號(month),表示每個月
2)斜線(/)
表示增長間隔,如第1個欄位(minutes) 值是 3-59/15,表示每小時的第3分鐘開始執行一次,之後每隔 15 分鐘執行一次(即 3、18、33、48 這些時間點執行),這裡也可以表示為:3/15
3)逗號(,)
用於列舉值,如第6個欄位值是 MON,WED,FRI,表示 星期一、三、五 執行
4)連字號(-)
表示一個範圍,如第3個欄位的值為 9-17 表示 9am 到 5pm 直接每個小時(包括9和17)
5)問號(?)
只用於 日(Day of month) 和 星期(Day of week),表示不指定值,可以用於代替 *
3、主要型別或介面說明
1)Cron:包含一系列要執行的實體;支援暫停【stop】;新增實體等
1 |
type
Cron struct { |
2 |
entries
[]*Entry |
3 |
stop
chan struct {} //
控制 Cron 例項暫停 |
4 |
add
chan *Entry //
當 Cron 已經運行了,增加新的 Entity 是通過 add 這個 channel 實現的 |
5 |
snapshot
chan []*Entry //
獲取當前所有 entity 的快照 |
6 |
running bool //
當已經執行時為true;否則為false |
7 |
} |
注意,Cron 結構沒有匯出任何成員。
注意:有一個成員 stop,型別是 struct{},即空結構體。
2)Entry:排程實體
1 |
type
Entry struct { |
2 |