【鳥哥 Linux 15】例行性工作排程(Linux定時任務)
【鳥哥 Linux 15】例行性工作排程(Linux定時任務)
定時任務的分類
-
例行性定時任務(循環間隔一定周期)。可通過
crontab來實現,依賴于crond服務。 -
突發性定時任務(只執行一次)。可通過
at來實現,依賴于atd服務。
Linux系統常見的例行性定時任務
-
log rotate: 登錄數據的新舊交換
-
logwatch: 分析登錄信息
-
updatedb: 更新locate的數據庫
-
mandb: 更新man page數據庫
-
更新RPM數據庫(僅紅帽系)
-
tmpwatch: 移除臨時文件
-
網絡服務相關行為分析
突發性定時任務(單次執行)
at命令和atd服務
- atd服務是負責突發性定時任務的服務,一般通過systemctl控制。
systemctl restart atd # 重啟atd服務
systemctl enable atd # 設置為開機自啟
systemctl status atd # 查看服務狀態
-
將某個任務以文本文件的方式寫入 /var/spool/at/ 目錄內,atd就會在指定時間點自動調用這個任務。
-
編輯/etc/at.allow以及/etc/at.deny文件來控制使用at的權限。三種情況如下:
第一種情況:能找到at.allow文件,那么寫在allow里面的用戶均可以使用at(較為嚴格)
第二種情況:沒有找到at.allow,但能找到at.deny文件,那么寫在deny里面的用戶不能使用at(較為松散)
第三種情況:兩個文件都沒有,那么就只有root用戶可以使用at
-
at指令的使用:命令行只需要指定時間就可以進入交互模式(at shell環境),在交互模式下輸入需要執行的指令(建議使用絕對路徑來下達指令)即可,詳細用法自行man page。
-
需要注意的是at指令的執行和tty無關,所有的標準輸出和標準錯誤輸出都會重定向到執行者的mailbox中,所以在at shell中僅使用
echo 'hello'是不會在指定時間點打印Hello的,需要顯式重定向輸出才行,就像這樣echo 'hello' > /dev/tty1 -
當用戶通過at shell下達了定時指令,該任務就獨立于當前用戶的bash環境了,直接交給系統atd服務來管理,有點類似nohup。
管理at工作
-
atq查詢所有的at排程 -
atrm移除at排程 -
batch
例行性定時任務(例程,循環執行)
用戶例行任務crontab基本使用
-
crontab指令來建立例行定時任務,建立的工作被放到/var/spool/cron中。 -
cron執行的每一項工作都會被記錄到/var/log/cron中 -
和at類似,使用/etc/cron.allow和/etc/cron.deny來限制使用者賬號
crontab -e # 當前用戶編輯自己的crontable
- 以上命令通過vi編輯crontable,一行一個例程。每一個例程六個字段,指定分鐘、小時、日期、月份、周、指令
- 輔助字符
| 字符 | 意義 |
|---|---|
| * | 不論何時 |
| , | 分隔多個時間 |
| - | 范圍時間(幾到幾) |
| /n | 在時間范圍內間隔多少執行一次(*/5 or 0-59/5) |
crontab -r # 刪除當前用戶所有crontable內容
- 如果只是想刪一條,請用
crontab -e編輯
系統例行任務相關配置文件
- 管理系統的例行任務,并非使用crontab命令,而是需要編輯相關的配置文件。
配置文件/etc/crontab
-
crond服務的最低時間粒度為1min。
-
因此,crond服務每分鐘讀取/etc/crontab(系統例行任務)和/var/spool/cron(用戶例行任務)中的內容
-
系統配置文件/etc/crontab比/var/spool/cron多了一些可用的設置(錯誤信息發送目標、執行指令搜索的PATH),同時配置服務的字段變成了七個:分鐘、小時、日期、月份、周、身份、指令。多了一個身份字段,表明后面的指令是誰執行的,默認是root。
【*】crond服務會讀取并執行哪些位置的配置?
-
/etc/crontab(*系統例程) -
/etc/cron.d/*(系統例程,內容和/etc/crontab幾乎一樣,配置自己開發的單個軟件的例程) -
/var/spool/cron/*(*用戶例程) -
/etc/cron.hourly:/etc/cron.d中存在0hourly例程,這個例程每個小時會執行/etc/cron.hourly中的所有腳本,所以也可以把需要每小時執行的腳本放在這里 -
/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly:這三個目錄里面的腳本由anacron來執行,anacron被/etc/cron.hourly/0anacron調用,/etc/cron.hourly/0anacron被/etc/cron.d/0hourly調用,/etc/cron.d/0hourly由crond服務調用。
【*】使用crontab的一些小技巧
-
避免同一時間點同時執行大量的例程。可以通過
,來交錯執行不同例程。 -
將不需要的輸出內容重定向到黑洞/dev/null
-
使用
/var/log/cron來檢查cron的執行,確保安全。 -
crontab使用的時候周和日月不能同時使用。
anacron: 關機期間的例程如何喚醒和執行?
anacron
-
當機器斷電,crond就沒辦法通過crontab(run-parts)執行例程了。
-
和crontab不同,anacron用于處理個人電腦上的例程以及因為某些原因沒有執行的例程的執行。
-
在cron.hourly中通過和
/var/spool/anacron中的時間記錄文件中記錄的時間戳的比對(具體邏輯可以查看/etc/cron.hourly/0anacron腳本),來判斷一個例程是否已經被執行。 -
anacron是一個程序
/usr/sbin/anacron,默認配置于/etc/cron.hourly中,所以是每小時被crond執行一次。
配置文件/etc/anacrontab
-
四個字段:
period in days、delay in minutes、job-identifier、command。 -
詳見
man anacrontab -
以cron.daily來展示執行的流程:
# 鳥哥第四版原文
1. 由 /etc/anacrontab 分析到 cron.daily 這項工作名稱的天數(period in days)為 1 天;
2. 由 /var/spool/anacron/cron.daily 取出最近一次執行 anacron 的時間戳;
3. 由上個步驟與目前的時間比較,若差異天數為 1 天以上 (含 1 天),就準備進行指令;
4. 若準備進行指令,根據 /etc/anacrontab 的設定,將延遲(delay in minutes) 5 分鐘 + 3 小時 (看 START_HOURS_RANGE 的
設定);
5. 延遲時間過后,開始執行后續指令,亦即『 run-parts /etc/cron.daily 』這串指令;
6. 執行完畢后, anacron 程序結束。
【*】anacron和crontab的關系總結
- 簡單來說,cron.hourly由crond每小時直接執行,而cron.daily、cron.weekly、cron.monthly都是由crond間接調用anacron程序來執行。詳見crond服務會讀取并執行哪些位置的配置:第5點

浙公網安備 33010602011771號