Linux定時任務之crond/crontab
定時任務,顧名思義即固定一段時間執行一次某任務。
例如手機設定的鬧鐘、定時開關機等都屬於定時任務,那麼Linux要如何設定定時任務呢?
crontab
首先認識crontab,該詞來源於希臘語chronos(χρόνος),原意是時間。
它是一個命令,常見於Unix和類Unix的作業系統之中,用於設定週期性被執行的指令。
該命令從標準輸入裝置讀取指令,並將其存放於“crontab”檔案中,以供之後讀取和執行。
crond
crond,與crontab是不可分割的,是crontab的守護程序。
守護程序(daemon)
它是一類在後臺執行的特殊程序,用於執行特定的系統任務。
很多守護程序在系統引導的時候啟動,並且一直執行直到系統關閉;另一些只在需要的時候才啟動,完成任務後就自動結束。
crontab file的格式
crontab檔案中的行由6個欄位組成,如下圖所示:
其中各項格式如下:
1. 分鐘:0-59,表示分鐘數與給出值相等時執行任務
2. 小時:0-23,表示小時數與給出值相等時執行任務
3. 日期:1-31,含義同上
4. 月份:1-12,含義同上
5. 周幾:0-6,含義同上,其中數值為0時表示週日
6. 執行內容:即在shell命令列中能執行的命令
crontab file格式中的特殊符號
1. * ——星號,代表當前值為允許範圍內的所有值,如第一個欄位為*表示每一分鐘都執行任務,即每個都、全部的意思
2. - ——減號,代表一段區間,如第一個欄位為1-3表示1、2、3分鐘執行任務
3. ,——逗號,代表一些值的集合,如第一個欄位為1,2,4表示1、2、4分鐘執行任務
4. /n ——n代表數值,如第一個欄位為/3表示每3分鐘執行一次任務
crontab的幫助資訊
在命令列中敲入“crontab -h”命令檢視crontab的幫助資訊,如下:
Usage:
crontab[options] file
crontab[options]
crontab -n [hostname]
Options:
-u <user> define user(確定使用者,如普通使用者、root)
-e edit user's crontab(編輯使用者的定時任務)
-l list user's crontab(檢視使用者的定時任務)
-r delete user's crontab(刪除使用者的定時任務)
-i prompt before deleting(刪除之前進行提示)
-n <host> set host in cluster to run users' crontabs(在簇中設定執行使用者定時任務的主機,小編還沒完全搞懂見諒哈O(∩_∩)O,歡迎各位大神指導!)
-c get host in cluster to run users' crontabs(獲取在簇中執行使用者定時任務的主機)
-s selinux context
-x <mask> enable debugging
本文介紹前五個較為常用的選項。
1. -l
-l選項預設情況下列印當前使用者的定時任務內容,通過下面的兩組操作即能證明。 如下圖:
圖1 普通使用者的定時任務內容
當切換為超級使用者root後,結果如下:
圖2 超級使用者的定時任務內容
如上,同樣的命令,在不同的使用者下結果顯然不同,故而-l命令預設情況下列印當前使用者的定時任務。
2.-u
那麼-l顯然不能滿足我們的需求,當需要檢視其它使用者的定時任務時,切換顯得尤為麻煩。此時-u的作用就體現出來了,話不多說直接上圖:
圖3 -u選項的應用
顯然,結果與圖1相同,即成功列印了使用者jing的定時任務。
那麼普通使用者是否可以檢視超級使用者的任務呢?顯然是不能的,也不應該能。
圖4 普通使用者嘗試訪問超級使用者的定時任務(失敗)
如上圖,系統打印出“必須擁有對-u指向使用者的特權”,即被該使用者允許才可讀取其定時任務。
3.-e
-e選項實現了當前使用者定時任務的編輯功能,預設使用vim編輯器,可以通過更改配置檔案進行更改。
假設,我們需要將當前時間列印在終端上,為了測試方便,所有時段均設為*值;將要執行的程式碼寫在檔案test.c中,內容如下:
圖5 要執行的程式碼內容
生成可執行檔案後,其絕對路徑為/home/jing/Code/pts_study/test,將其結果重定向到終端8的螢幕上,程式碼如下:
圖6 普通使用者定時任務程式碼
儲存退出後可看到如下提示,即為定時任務新增成功:
圖7 新增成功提示
顯然,有時這種方法也不夠方便,還有一種新增定時任務的方法,是將命令寫入檔案,執行crontab file即可新增成功,新增如下:
圖8 寫在檔案中的命令
上述任務表示每分鐘將當前date(日期)輸出重定向至7號終端,並將該date輸出重定向至指定路徑下的date.txt檔案。
之前我們已經在使用者jing中添加了一項定時任務(如圖6所示):每分鐘在8號終端上執行test檔案,其中test檔案將輸出當前終端的0、1、2號檔案描述符所指向的內容,即stdin、stdout和stderr;
現在再在超級使用者中新增上述任務檔案。
一段時間後分別觀察7、8號終端情況以及date.txt檔案內容如下:
圖9 8號終端輸出情況
圖10 7號終端輸出情況
圖11 date.txt檔案內容
4.-r
-r表示刪除定時任務,預設為當前使用者的。
如下圖所示,首先執行crontab -l命令,檢視當前使用者的定時任務,而後-r選項進行刪除,最終再次-l檢視,顯示“no crontab for jing”,即使用者jing已無定時任務,刪除成功!
圖12 定時任務的刪除
5.-i
-i表示在刪除任務之前進行提示,輸入y表示確認刪除,n表示取消,如下圖所示:
圖13 -i選項的使用方法