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