1. 程式人生 > >Go語言版crontab

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