這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
生命不止,繼續 go go go !!!
今天,跟大家分享的是在golang中執行定時任務,主要介紹兩個github上的開源庫的使用。
Linux下crontab
crontab 命令常見於Unix和類Unix的作業系統之中,用於設定周期性被執行的指令。 該命令從標準輸入裝置讀取指令,並將其存放於“crontab”檔案中,以供之後讀取和執行。 該詞來源於希臘語chronos(χρόνος),原意是時間。
通常,crontab儲存的指令被守護進程啟用,crond常常在後台運行,每一分鐘檢查是否有預定的作業需要執行。這類作業一般稱為cron jobs。
crontab檔案包含送交cron守護進程的一系列作業和指令。每個使用者可以擁有自己的crontab檔案;同時,作業系統儲存一個針對整個系統的crontab檔案,該檔案通常存放於/etc或者/etc之下的子目錄中,而這個檔案只能由系統管理員來修改。
crontab檔案的每一行均遵守特定的格式,由空格或tab分隔為數個領域,每個領域可以放置單一或多個數值。
命令
安裝crontab:
yum install crontabs
啟動:
service crond start
關閉:
service crond stop
重啟:
service crond restart
重載:
service crond reload
查看狀態:
service crond status
編輯任務:
crontab -e
查看任務:
crontab -l
刪除:
crontab -r
格式
分 時 日 月 星期 要啟動並執行命令
操作符號
在一個地區裡填寫多個數值的方法:
逗號(’,’)分開的值,例如:“1,3,4,7,8”
連詞符(’-‘)指定值的範圍,例如:“1-6”,意思等同於“1,2,3,4,5,6”
星號(’*’)代表任何可能的值。例如,在“小時域”裡的星號等於是“每一個小時”,等等
某些cron程式的擴充版本也支援斜線(’/’)操作符,用於表示跳過某些給定的數。例如,“*/3”在小時域中等於“0,3,6,9,12,15,18,21”等被3整除的數;
執行個體
每分鐘執行一次命令:
* * * * * yourCommand
每小時的第2和第10分鐘執行:
2,10 * * * * yourCommand
每天上午9點到12點的第2和第10分鐘執行:
2,10 9-12 * * * yourCommand
每隔兩天的上午9點到12點的第2和第10分鐘執行:
2,10 9-12 */2 * * yourCommand
每周一上午9點到12點的第2和第10分鐘執行:
2,10 9-12 * * 1 yourCommand
robfig/cron
安裝:
go get -u github.com/robfig/cron
應用:
每分鐘執行一次:
package mainimport ( "log" "github.com/robfig/cron")func main() { i := 0 c := cron.New() spec := "0 */1 * * * *" c.AddFunc(spec, func() { i++ log.Println("execute per second", i) }) c.Start() select {}}
其中注意select的用法:
golang 的 select 的功能和 select, poll, epoll 相似, 就是監聽 IO 操作,當 IO 操作發生時,觸發相應的動作。
每天上午9點到12點的第2和第10分鐘執行:
package mainimport ( "fmt" "github.com/robfig/cron")func main() { spec := "2,10 9-12 * * *" // 每天上午9點到12點的第2和第10分鐘執行 c := cron.New() c.AddFunc(spec, myFunc) c.Start() select {}}func myFunc() { fmt.Println("execute")}
jasonlvhit/gocron
安裝:
go get -u github.com/jasonlvhit/gocron
每隔1秒執行一個任務,每隔4秒執行另一個任務:
package mainimport ( "fmt" "time" "github.com/jasonlvhit/gocron")func task() { fmt.Println("I am runnning task.", time.Now())}func superWang() { fmt.Println("I am runnning superWang.", time.Now())}func main() { s := gocron.NewScheduler() s.Every(1).Seconds().Do(task) s.Every(4).Seconds().Do(superWang) sc := s.Start() // keep the channel go test(s, sc) // wait <-sc // it will happens if the channel is closed}func test(s *gocron.Scheduler, sc chan bool) { time.Sleep(8 * time.Second) s.Remove(task) //remove task time.Sleep(8 * time.Second) s.Clear() fmt.Println("All task removed") close(sc) // close the channel}