自動化的定時任務

1、定時任務的場景

日常工作生活中,經常會有規定時間或按一定週期執行的任務或活動,比如每週一要開會,每月初要出統計報表,每隔一段時間要清除日誌等。人難免有疏忽,對於計算機指令可完成的事情,通過計劃定時任務可實現自動化執行,省心省力。

2、表達設計

表達一項定時任務,直接的想法當然就是如此:

時間約定 執行命令

時間約定:即定時,用於規定時間。這主要解決每週一,每月1號,每隔5分鐘如何表述的問題,一種不錯的定義詳見表達式結構小節。
執行命令:要執行的任務,在系統中即爲命令或腳本。

3、crontab 命令

Linux 系統提供了計劃任務的 crontab 命令,相關服務默認是開啓的,通過以下命令可以查看服務狀態。

# ubuntu下
service cron status 
# 其它或可能  
service crond status

使用 crontab 命令可查看和編輯定時任務。

# 查看已配置的定時任務列表
crontab -l   
# 編輯定時任務
crontab -e 

配置內容,每行表達一項定時任務(#號開頭表示註釋)。

3.1、表達式結構

結構如下,一行中前面5節用於配置時間約定,之後就是要執行的命令。

幾分 幾時 幾日 幾月 周幾 命令

如下圖所示:


描述
幾分 表示分鐘,取值範圍 0 ~ 59。
幾時 表示小時,取值範圍 0 ~ 23。
幾日 表示日期,取值範圍 1 ~ 31。
幾月 表示月份,取值範圍 1 ~ 12。
周幾 表示星期幾,取值範圍 0 ~ 7,0 和 7 都表示星期日。

除了直接設定爲某個值,每節的時間還可按如下形式配置:

符號 描述
* 星號 * 代表所有可能的值,幾分爲 *,則表示每一分鐘。
, 逗號可以指定一個列表範圍,如“1,3,5”
- 中槓號可以表示一個範圍,如“2-6”表示“2,3,4,5,6”
/ 正斜線指定時間的間隔頻率,幾分爲 */10,表示每十分鐘。

3.2、實例

假設我們的任務是定期將時間寫入一個日誌文件,即命令如下。

echo $(date) >> /home/ubuntu/c.log

3.2.1 每分鐘執行一次

* * * * * echo $(date) >> /home/ubuntu/c.log

3.2.2 每天8點到17點的第15和第45分鐘執行

15,45 8-17 * * * echo $(date) >> /home/ubuntu/c.log

3.2.3 每週一上午8點30分鐘執行

30 8 * * 1 echo $(date) >> /home/ubuntu/c.log

3.2.4 每月1、15日01:00執行

0 1 1,15 * * echo $(date) >> /home/ubuntu/c.log

3.2.5 每一小時執行一次

* */1 * * * echo $(date) >> /home/ubuntu/c.log

3.2.6 晚上11點到早上7點之間每隔一小時執行一次

* 23-7/1 * * * echo $(date) >> /home/ubuntu/c.log

4、秒級表達

由於這裏的最小粒度爲分鐘,秒級表達的一種辦法是讓一分鐘執行多次相同的任務,通過 sleep 延時的方式在1分鐘內分片執行。

* * * * * command
* * * * * sleep 20; command
* * * * * sleep 40; command

5、踩坑

5.1 % 坑

當命令本身包含 % 時,需要加 \ 轉義。

# 標準命令
echo $(date "+%Y-%m-%d %H:%M:%S")
# 表達式配置
* * * * * echo $(date "+\%Y-\%m-\%d \%H:\%M:\%S") >> /home/ubuntu/c.log

6、後話

擁有一臺linux雲服務器,則可以輕鬆的定義多個定時任務。而這個任務是什麼呢?其實任務不一定要是同一臺服務器上的,任何一個 URL 都可以看成是一項可執行的任務。

例如,一個統計數據通知的頁 http://*domain.com/statnotify,其功能是打開即向指定郵箱發送統計數據,則在任一服務器上定義如下定時任務都可達到每天自動執行的目的。

# 每天自動觸發統計通知
* * */1 * * curl http://*domain.com/statnotify
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章