1. 程式人生 > >第十五章 例行性工作(crontab)--循環執行的例行性工作調度 crontab(定時任務)

第十五章 例行性工作(crontab)--循環執行的例行性工作調度 crontab(定時任務)

microsoft 順序 image 技術 inf 5.4 3.2 排序 文本

循環執行的例行性工作調度 crontab(定時任務)

15.1 例行性工作調度 不考慮硬件與服務器的鏈接狀態,Linux幫助提醒很多任務。 Linux例行性工作是如何進行調度的? Linux調度就是通過 crontab 與 at 這兩個東西 15.1.1 Linux工作調度的種類:at,cron 兩種工作調度的方式: 一種是例行性的,每隔一定的周期要來辦的事情,定時任務 一種是突發性的,就是每次做完以後就不在執行的,只調度一次 at:at是可以處理僅執行一次就結束調度的指令,不過要執行at時,必須要有 atd這個服務的支持才行。在某些新版的 distributions 中,atd 可能默認並沒有啟動,那麽 at 這個指令就會失效呢!不過我們 CentOS 默認是啟動的!
crontab:crontab 這個指令所設置的工作將會循環的一直進行下去! 可循環的時間為分鐘、小時、每周、每月或每年等。crontab 除了可以使用指令執行外,亦可編輯 /etc/crontab 來支持。 讓 crontab 可以生效的服務則是 crond 這個服務! 15.1.2 CentOS Linux系統上常見的例行性工作 Linux系統常見的例行性任務有: ① 進行登錄文件的輪替(log rotate):Linux會主動的將系統所發生的各種信息都記錄下來,這就是登錄文件(第十八章)。 系統會一直記錄登錄信息,所以登錄文件將會越來越大,大型文件不但占容量還會造成讀寫性能的困擾,因此適時的將登陸文件數據挪一挪,讓舊的數據與新的數據分別存放可以有效的記錄登錄信息。這就是 log rotate 的任務,這也是系統必要的例行任務。
②登錄文件分析 logwatch 的任務:如果系統發生軟件問題、硬件錯誤、資安問題等,絕大部分的錯誤信息都會被記錄到登錄文件中, 因此系統管理員的重要任務之一就是分析登錄文件。但你不可能手動通過 vim 等軟件去檢視登錄文件,因為數據太復雜了! 我們的 CentOS 提供了一只程序“ logwatch ”來主動分析登錄信息。 ③創建 locate 的數據庫: 在第六章我們談到的 locate 指令時, 我們知道該指令是通過已經存在的文件名數據庫來進行系統上文件名的查詢。我們的文件名數據庫是放置到 /var/lib/mlocate/ 中。 問題是,這個數據庫怎麽會自動更新啊?這就是系統的例行性工作所產生的效果,系統會主動的進行 updatedb !
④man page 查詢數據庫的創建: 與 locate 數據庫類似的,可提供快速查詢的 man pagedb 也是個數據庫,但如果要使用 man page 數據庫時,就得要執行 mandb 才能夠創建好! 而這個 man page 數據庫也是通過系統的例行性工作調度來自動執行的。 ⑤RPM 軟件登錄文件的創建: RPM (第二十二章) 是一種軟件管理的機制。由於系統可能會常常變更軟件, 包括軟件的新安裝、非經常性更新等,都會造成軟件文件名的差異。為了方便未來追蹤,系統也幫我們將文件名作個排序的記錄, 有時候系統也會通過調度來幫 RPM 數據庫的重新創建。 ⑥移除暫存盤: 某些軟件在運行中會產生一些暫存盤,但是當這個軟件關閉時,這些暫存盤可能並不會主動的被移除。 有些暫存盤則有時間性,如果超過一段時間後,這個暫存盤就沒有效用了,此時移除這些暫存盤就是一件重要的工作! 否則磁盤容量會被耗光。系統通過例行性工作調度執行名為 tmpwatch 的指令來刪除這些暫存盤。 ⑦與網絡服務有關的分析行為: 如果你有安裝類似 WWW 服務器軟件 (一個名為 apache的軟件),那麽你的 Linux 系統通常就會主動的分析該軟件的登錄文件。 同時某些憑證與認證的網絡信息是否過期的問題, Linux 系統也會很友好的進行自動檢查。 15.2 僅執行一次的工作調度 at:單一工作調度的運行 15.3 循環執行的例行性工作調度 相對於 at 是僅執行一次的工作,循環執行的例行性工作調度則是由 cron (crond) 這個系統服務來控制的。 Linux系統上面原本就有非常多的例行性工作,因此這個系統服務是默認啟動的。 使用者自己也可以進行例行性工作調度,所以,Linux也提供使用者控制例行性工作調度的指令(crontab) 15.3.1 使用者的設置   使用者想要創建循環型工作調度時使用的是 crontab 這個指令。為了安全性的問題與at一樣,我們可以限制使用 crontab 的使用者帳號。使用的限制數據有:   /etc/cron.allow: 將可以使用 crontab 的帳號寫入其中,若不在這個文件內的使用者則不可使用 crontab;   /etc/cron.deny: 將不可以使用 crontab 的帳號寫入其中,若未記錄到這個文件當中的使用者,就可以使用 crontab 。   以優先順序來說, /etc/cron.allow 比 /etc/cron.deny 要優先而判斷上面,這兩個文件只選擇一個來限制而已,因此,建議你只要保留一個即可, 免得影響自己在設置上面的判斷!一般來說,系統默認是保留 /etc/cron.deny , 可以將不想讓他執行 crontab 的那個使用者寫入 /etc/cron.deny 當中,一個帳號一行! 當使用者使用 crontab 這個指令來創建工作調度之後,該項工作就會被記錄到 /var/spool/cron 裏面去,而且是以賬號來作為判別的。 如下:root用戶使用 crontab 後,工作會被記錄到 /var/spool/cron/root 文件中去,不要使用 vi 直接編輯該文件,因為可能由於輸入語法錯誤,會導致無法執行cron /var/spool/cron/ 中的內容: 技術分享圖片 另外,cron 執行的每一項工作都會被記錄到 /var/log/cron 這個登錄文件中,所以Linux不知道是否被植入木馬時,也可以搜尋一下 /var/log/cron 這個登錄文件 技術分享圖片 crontab語法: 技術分享圖片 例如: 技術分享圖片 默認情況下,任何使用者只要不被列入 /etc/cron.deny 當中,就可以直接使用 crontab -e 去編輯自己的例行性命令 整個過程就如上,會進入 vi 的編輯畫面, 然後以一個工作一行來編輯。 而每項工作 (每行) 的格式都是具有六個字段,這六個字段的意義為: 技術分享圖片 周的數字為0或7時,都代表“星期天”的意思 輔助字符: 技術分享圖片 例如:每 5 分鐘需要執行 /home/root/test.sh 一次,使用 crontab -e 進入編輯: * /5 * * * * /home/root/test.sh crontab 每個人都只有一個文件存在,就是在 /var/spool/cron 裏面 指令下達時,最好使用絕對路徑,這樣比較不會找不到可執行文件 技術分享圖片 查詢使用者目前的 crontab 內容: 技術分享圖片 pay平臺: 技術分享圖片 註意:只要刪除某個 crontab的工作項目,使用 crontab -e 來重新編輯即可 使用 crontab -r 的參數,是會將所有的 crontab 數據內容都刪除掉的 15.3.2 系統的配置文件: /etc/crontab,/etc/cron.d/* crontab -e 是針對使用者的 cron 來設計的 如果是“系統的例行性任務"時該怎麽辦?只需要編輯 /etc/crontab 這個文件就可以 crontab -e 這個 crontab 其實是 /usr/bin/crontab 這個可執行文件,但是 /etc/crontab 是一個純文本文件,可以使用 root的身份編輯 cron 這個服務的最低偵測限制是 "分鐘",所以 cron 會每分鐘去讀一次 /etc/crontab 與 /var/spool/cron 裏面的數據內容 因此只要編輯完 /etc/crontab 這個文件,並存儲之後,cron的設置就自動的會來執行了 Tips: 在 Linux 下面的 crontab 會自動的幫我們每分鐘重新讀取一次 /etc/crontab 的例行工作事項,但是某些原因或者是其他的 Unix 系統中,由於 crontab 是讀到內存當中的,所以在修改完 /etc/crontab 之後,可能並不會馬上執行,這時候需要重新啟動 crond 這個服務 systemctl restart crond /etc/crontab 文件內容: 技術分享圖片 MAILTO=root: 這個項是說,當 /etc/crontab 這個文件中的例行性工作的指令發生錯誤時,或者是該工作的執行結果有 STDOUT/STDERR 時,會將錯誤訊息或者是屏幕顯示的訊息傳給誰?默認當然是由系統直接寄發一封 mail 給 root 。不過, 由於 root 並無法在用戶端中以 POP3 之類的軟件收信,因此,可以將這個 e-mail 改成自己的帳號,可以隨時了解系統的狀況。例如: MAILTO=[email protected] PATH=....: 在第十章的 BASH 當中一直提到的可執行文件路徑, 這裏就是輸入可執行文件的搜尋路徑。使用默認的路徑設置就已經足夠了。 "分 時 日 月 周 身份 指令"七個字段的設置 /etc/crontab 裏面可以設置的基本語法與 crontab -e 不太相同. 前面同樣是分、時、日、月、周五個字段, 但是在五個字段後面接的並不是指令,而是一個新的字段,那就是“執行後面那串指令的身份”. 這與使用者的 crontab -e 不相同。由於使用者自己的 crontab 並不需要指定身份,但 /etc/crontab 裏面要指定身份. 以上表的內容來說,系統默認的例行性工作是以 root 的身份來進行的。 crond 服務讀取配置文件的位置: 一般來說,crond 默認有三個地方會有執行腳本配置文件,他們分別是: /etc/crontab /etc/cron.d/* /var/spool/cron/* 這三個地方中,跟系統的運行比較有關系的兩個配置文件是放在 /etc/crontab 文件內以及 /etc/cron.d/* 目錄內的文件, 另外一個是跟用戶自己的工作比較有關的配置文件,就是放在 /var/spool/cron/ 裏面的文件群。 現在我們已經知道了 /var/spool/cron 以及 /etc/crontab 的內容. /etc/cron.d 中的內容: 內容跟 /etc/crontab 幾乎一模一樣,實際上最後一行是設置的值 技術分享圖片 註意一下上面表格中提到的最後一行,每個整點的一分會執行“ run-parts/etc/cron.hourly ”這個指令,什麽是 run-parts 呢? 如果你有去分析一下這個可執行文件,會發現他就是 shell script,run-parts 腳本會在大約 5 分鐘內隨機選一個時間來執行 /etc/cron.hourly 目錄內的所有可執行文件!因 放在 /etc/cron.hourly 的文件必須是能被直接執行的指令腳本,而不是分、時、日、月、周的設置值 技術分享圖片 如果自己開發新的軟件,該軟件要擁有自己的 crontab 定時指令時,就可以將“分、時、日、月、周、身份、指定”的配置文件放置到 /etc/cron.d/ 目錄下,在此目錄下的文件是 crontab 的配置文件腳本 Tips :以鳥哥來說,現在鳥哥有在開發一些虛擬化教室的軟件,該軟件需要定時清除一些垃圾防火墻規則, 那鳥哥就是將要執行的時間與指令設計好,然後直接將設置寫入到 /etc/cron.d/newfile 即可!未來如果這個軟件要升級, 直接將該文件覆蓋成新文件即可!比起手動去分析 /etc/crontab 要單純的多! 也就是說,除了自己指定分、時、日、月、周加上指令路徑的 crond 配置文件之外,你也可以直接將指令放置到(或鏈接到)/etc/cron.hourly/ 目錄下, 則該指令就會被 crond 在每小時的 1 分開始後的 5 分鐘內,隨機取一個時間點來執行啰!你無須手動去指定分、時、日、月、周就是了。 但是眼尖的朋友可能還會發現,除了可以直接將指令放到 /etc/cron.hourly/ 讓系統每小時定時執行之外,在 /etc/ 下面其實還有 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/,那三個目錄是代表每日、每周、每月各執行一次。不過,跟 /etc/cron.hourly/ 不太一樣的是,那三個目錄是由 anacron 所執行的,而 anacron 的執行方式則是放在 /etc/cron.hourly/0anacron 裏面。跟前幾代 anacron 是單獨的 service 不太一樣。 總結: 技術分享圖片 15.3.3 註意事項 技術分享圖片 取消不要的輸出項目 技術分享圖片 15.4 可喚醒停機期間的工作任務 anacron指令可以幫助進行時間到了但是卻沒有執行的調度 場景: 技術分享圖片 15.4.1 什麽是 anacron anacron 並不是用來取代 crontab 的,anacron 存在的目的就在於我們上頭提到的,在處理非24 小時一直啟動的 Linux 系統的 crontab 的執行! 以及因為某些原因導致的超過時間而沒有被執行的調度工作。 其實 anacron 也是每個小時被 crond 執行一次,然後 anacron 再去檢測相關的調度任務有沒有被執行,如果有超過期限的工作在, 就執行該調度任務,執行完畢或無須執行任何調度時,anacron 就停止了。由於 anacron 默認會以一天、七天、一個月為期去偵測系統未進行的 crontab 任務,因此對於某些特殊的使用環境非常有幫助。 舉例來說,如果你的 Linux 主機是放在公司給同仁使用的,因為周末假日大家都不在所以也沒有必要打開, 因此你的 Linux 是周末都會關機的。但是crontab 大多在每天的淩晨以及周日的早上進行各項任務, 偏偏你又關機了,此時系統很多 crontab 的任務就無法進行。 anacron 剛好可以解決這個問題! anacron 又是怎麽知道我們的系統啥時關機的呢? 這就得要使用 anacron 讀取的時間記錄文件 (timestamps) 了! anacron 會去分析現在的時間與時間記錄文件所記載的上次執行 anacron 的時間,兩者比較後若發現有差異, 那就是在某些時刻沒有進行 crontab。此時anacron 就會開始執行未進行的 crontab 任務了! 15.4.2 anacron 與 /etc/anacrontab anacron 其實是一支程序並非一個服務!這支程序在 CentOS 當中已經進入 crontab 的調度,同時 anacron 會每個小時被主動執行一次。所以 anacron 的配置文件應該放置在 /etc/cron.hourly : 技術分享圖片 所以其實也僅僅是執行 anacron -s 的指令 anacron 的語法如下: 技術分享圖片 在我們的 CentOS 中,anacron 的進行其實是在每個小時都會被抓出來執行一次, 但是為了擔心 anacron 誤判時間參數,因此 /etc/cron.hourly/ 裏面的 anacron 才會在文件名之前加個 0(0anacron),讓 anacron 最先進行!就是為了讓時間戳記先更新!以避免 anacron 誤判 crontab 尚未進行任何工作的意思。 接下來我們看一下 anacron 的配置文件: /etc/anacrontab 的內容好了: 技術分享圖片 技術分享圖片 拿 /etc/cron.daily/ 那一行的設置來說明好了。四個字段的意義分別是: 天數:anacron 執行當下與時間戳記 (/var/spool/anacron/ 內的時間紀錄檔) 相差的天數,若超過此天數,就準備開始執行,若沒有超過此天數,則不予執行後續的指令。 延遲時間:若確定超過天數導致要執行調度工作了,那麽請延遲執行的時間,因為擔心立即啟動會有其他資源沖突的問題吧! 工作名稱定義:這個沒啥意義,就只是會在 /var/log/cron 裏頭記載該項任務的名稱這樣!通常與後續的目錄資源名稱相同即可。 實際要進行的指令串:有沒有跟 0hourly 很像啊!沒錯!相同的作法啊!通過 run-parts 來處理的! 根據上面的配置文件內容,我們大概知道 anacron 的執行流程應該是這樣的 (以 cron.daily為例): 1. 由 /etc/anacrontab 分析到 cron.daily 這項工作名稱的天數為 1 天; 2. 由 /var/spool/anacron/cron.daily 取出最近一次執行 anacron 的時間戳記; 3. 由上個步驟與目前的時間比較,若差異天數為 1 天以上 (含 1 天),就準備進行指令; 4. 若準備進行指令,根據 /etc/anacrontab 的設置,將延遲 5 分鐘 + 3 小時 (看START_HOURS_RANGE 的設置); 5. 延遲時間過後,開始執行後續指令,亦即“ run-parts /etc/cron.daily ”這串指令; 6. 執行完畢後, anacron 程序結束。 如此一來,放置在 /etc/cron.daily/ 內的任務就會在一天後一定會被執行的!因為 anacron 是每個小時被執行一次。 所以,現在你知道為什麽隔了一陣子才將 CentOS 開機,開機過後約 1 小時左右系統會有一小段時間的忙碌!而且硬盤會跑個不停!那就是因為 anacron 正在執行過去 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 裏頭的未進行的各項工作調度 最後,我們來總結一下本章談到的許多配置文件與目錄的關系,這樣我們才能了解 crond 與 anacron 的關系: 1. crond 會主動去讀取 /etc/crontab,/var/spool/cron/,/etc/cron.d/ 等配置文件,並依據“分、時、日、月、周”的時間設置去各項工作調度; 2. 根據 /etc/cron.d/0hourly 的設置,主動去 /etc/cron.hourly/ 目錄下,執行所有在該目錄下的可執行文件; 3. 因為 /etc/cron.hourly/0anacron 這個指令檔的緣故,主動的每小時執行 anacron ,並調用 /etc/anacrontab 的配置文件; 4. 根據 /etc/anacrontab 的設置,依據每天、每周、每月去分析 /etc/cron.daily/,/etc/cron.weekly/, /etc/cron.monthly/ 內的可執行文件,以進行固定周期需要執行的指令。 也就是說,如果你每個周日的需要執行的動作是放置於 /etc/crontab 的話,那麽該動作只要過期了就過期了,並不會被抓回來重新執行。 如果是放置在 /etc/cron.weekly/ 目錄下,那麽該工作就會定期,幾乎一定會在一周內執行一次~如果你關機超過一周,那麽一開機後的數個小時內,該工作就會主動的被執行. Tips :基本上,crontab 與 at 都是“定時”去執行,過了時間就過了!不會重新來一遍 anacron 則是“定期”去執行,某一段周期的執行~ 因此,兩者可以並行,並不會互相沖突. 定時任務每部分的含義: 技術分享圖片 秒(0-59)、分(0-59)、時(0-23)、天(1-31)、月(1-12)、周(1-7)、年(1970-2099)
* :代表任何值 ? : 也代表任何值,但只用於 Day-of-month 和 Day-of-Week ,當其中一個設置了條件時,另外一個就要用 ? 來表示“任何值” - : 用來表示範圍,比如 Day-of-month 5-10 代表 5號到10號 , :用來添加附加的參數,比如 Hours 4,14 代表上午 4 點和下午兩點 / : 用來代表增量以用來循環,比如 Hours 2/6 代表 2點,8點,下午2點,下午8點 L : 用於 Day-of-month 和 Day-of-Week, 代表最後1天,在Day-of-month中只用‘L‘就可以,在Day-of-week中用 ‘nL‘ 來代表是最後一個星期n W : 用於 Day-of-month, 代表最近工作日,比如 ‘15W‘, 如果15號那天是周六則取14號周五,如果是周日則取16號周一,其他情況不變 LW : 代表當月最後一個工作日 # : 用於 Day-of-Week, ‘n#m‘用於代表當月第m個 "周n"(根據n在week中的定義確定)

第十五章 例行性工作(crontab)--循環執行的例行性工作調度 crontab(定時任務)