如何管理多臺機器上的 crontab 任務

*nix 機器上,咱們一般用 crontab 來管理定時任務,好比指定時間重啓某個服務,備份數據庫,跑某些分析/統計服務等。node

目前有不少任務調試系統和工具,好比:git

每一個系統都有本身的特點和應用場景,若是你只想集中管理多臺機器上的定時任務,能夠試試 cronsungithub

cronsun 支持:web

  • Web 界面統一管理任務
  • 任務失敗重試
  • 任務失敗郵件提醒
  • 多機單任務(防止單機掛掉任務不按時執行)
  • 單機任務並行數限制
  • 執行單次任務
  • 多機器嚴格的時間間隔任務
  • 支持安全性配置,能夠限制任務腳本的後綴和執行用戶
  • ...

cronsun 架構:

[web]
                                                  |
                                     --------------------------
           (add/del/update/exec jobs)|                        |(query job exec result)
                                   [etcd]                 [mongodb]
                                     |                        ^
                            --------------------              |
                            |        |         |              |
                         [node.1]  [node.2]  [node.n]         |
             (job exec fail)|        |         |              |
          [send mail]<-----------------------------------------(job exec result)

cronsun 主要概念:

任務

任務類型

cronsun 中,有三種類型的的任務:mongodb

  • 普通任務,和 crontab 中的任務同樣。
  • 單機單進程任務,普通的 crontab 任務是單機的,若是執行任務的機器出現問題,任務可能執行失敗。cronsun 提供此任務類型是保證有多臺機器能夠執行一個任務,但在執行任務被執行時,只有一臺機器在執行任務。
  • 一個任務執行間隔內容許執行一次,這個類型的任務和單機單進程任務相似,但限制更嚴格。由於多臺機器間,時間可能會不一致,而某些任務要求執行的時間間隔要嚴格一致時,能夠考慮採起這種類型。

任務分組

任務分組是爲了方便管理,在添加任務時能夠在任務分組裏增長新的分組,查詢時按分組查出相應的任務。shell

任務腳本

至關於 crontab 中的執行命令,複雜的任務(如 pipe)須要寫成 shell 腳本。數據庫

用戶

指定執行任務的用戶apache

超時設置

超過設定的時長,cronsun 會中止執行任務,防止出問題的任務長時間佔用資源。安全

並行數設置

設置在單個節點上面同時可執行多少個相同的任務,針對某些任務執行時間很長,但兩次任務執行間隔較短時比較有用。swoole

失敗重試

任務執行失敗時,從新嘗試執行任務,直到任務執行成功或超過設置的次數。

定時器

至關於 crontab 中的時間規則,cronsun 中的時間規則支持到秒級,比 crontab 多支持一位,cronsun 中支持多種時間格式。一個任務能夠有多個定時器,主要是方便於多個節點在不一樣時間點執行同一個任務。

經常使用時間格式:

0  1   2   3   4   5
|    |    |    |    |    |
|    |    |    |    |    +------ day of week (0 - 6) (Sunday=0)
|    |    |    |    +------ month (1 - 12)
|    |    |    +-------- day of month (1 - 31)
|    |    +---------- hour (0 - 23)
|    +------------ min (0 - 59)
+-------------- sec (0-59)
字段名 容許的值 容許的特殊字符
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 SUN-SAT * / , - ?

星號 ( * )

星號會匹配字段中的全部值,如在小時字段用了星號,表示每一個小時都會匹配。

斜線 ( / )

匹配指定的數字,如 */3 在小時字段中等於 0,3,6,9,12,15,18,21 等被 3 整除的數。

逗號 ( , )

匹配分開的值,如 1,3,4,7,8 在小時字段中表示這裏面的小時會匹配。

連詞符 ( - )

匹配範圍,例如:1-6,意思等同於 1,2,3,4,5,6

問題 ( ? )

在 day-of-month 或者 day-of-week 字段可代替 *

預約格式

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 on Sunday 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 * * * *

節點

執行任務的機器,須要部署 cronnode

節點分組

方便管理節點,若是在任務的定時器裏選擇某個節點分組,則表示任務會在這個節點分組的全部結點上運行。

故障節點

cronnode 出現問題的節點,通常狀況下是 cronnode 服務掛掉,若是 etcd 的網絡很差,也會臨時出現故障節點。

離線節點

cronnode 服務正常關閉的結點。

正常結點

正常服務的結點。

日誌

用於查詢任務的執行結果,日誌存儲在 MongoDB 中,若是隻想保存最新一段時間內的執行結果,可使用 MongoDB 的 Capped Collections,在部署的時候建立一個名爲 job_log 的 Capped Collection。

相關文章
相關標籤/搜索