Linux定時執行任務——例行性工作排程
第1章 什麼是例行性工作
舉例來說,如果你想要在家人的生日前一天就發出一封email提醒自己不要忘記,那麼發email這個工作就是例行性工作。例行性工作具有周期性和固定性,這些工作可以交由linux系統按時啟動與完成。
第2章 linux工作排程種類
工作排程有兩種方式: 1、 一種是例行性的,就是每隔一定的週期要來辦的事項。 2、 一種是突發性的,這次做完就沒有第二次了。 在linux系統中,這兩種方式就分別對應著crontab與at這兩個命令了。
第3章 僅執行一次的工作排程
at是個可以處理僅執行一次就結束排程的命令,不過要執行at,必須要有atd這個服務的支援才行。我們可以使用命令service atd status來檢視atd服務是否啟動:
[[email protected] ~]$ service atd status
atd (pid 2047) is running...
如果沒有啟動,則可以使用service atd start來進行啟動。
3.1 at的工作原理
at的工作原理非常簡單:它使用at命令來生成所要執行的工作,並將這個工作以文字檔案的方式寫入var/spool/at/目錄內,該工作便能等待atd這個服務的取用與執行了。
3.2 at的安全問題
由於at可以在後臺定時執行命令,所以常常會被黑客用來執行病毒程式。因此對於at的使用許可權就必須要相當謹慎。 我們可以利用/etc/at.allow與/etc/at.deny這兩個檔案來進行at的使用限制。從下面的at執行流程中,就可以看出這兩個檔案的作用: 1、 先尋找/etc/at.allow這個檔案,寫在這個檔案中的使用者才能使用at,沒有在這個檔案中的使用者則不能使用(即使沒在at.deny中)。 2、 如果/etc/at.allow不存在,就尋找/etc/at.deny檔案,寫在該中的使用者則不能使用at,沒有在該檔案中的使用者可以使用at。 3、 如果兩個檔案都不存在,那麼只有root可以使用at命令。
通過上面的說明可以看出,at.allow的管理較為嚴格,而at.deny的管理則較為鬆散。在我的linux主機上,則僅保留了at.deny檔案。
3.3 at語法
at的語法如下所示:
at [-mldv] TIME
at -c 工作號碼
引數:
-m:當at工作完成後,即使沒有輸出資訊,也發email通知使用者該工作已完成
-l:list,相當於atq,列出該使用者的所有at排程
-d:delete,相當於atrm,取消一個工作排程
-v:顯式工作將被執行的時間
-c:列出該排程的工作內容——要執行的命令等
TIME:時間格式,定義什麼時候執行at的工作內容
HH:MM 如04:30 在今天的HH:MM執行,若已超過該時刻,則明天這個時刻執行。 HH:MM YYYY-MM-DD 如04:30 2018-10-01 在指定年月日、時分秒時刻執行at排程 HH:MM + number [minutes|hours|days|weeks] 在某個時間點後再加多長時間執行。如now + 5 minutes
3.4 at使用示例
使用at定義一項任務:2分鐘後向遠端終端pts/1列印“Hello World”:
[email protected]:/dev# at now + 2 minutes
at> echo "Hello World" >/dev/pts/1
at> <EOT>
job 3 at Mon Oct 1 14:47:00 2018
[email protected]:/dev# atq
3 Mon Oct 1 14:47:00 2018 a root
//2 minutes later
[email protected]:/dev# Hello World
可以看到,2分鐘後向螢幕列印了HelloWorld字串。 從上面可以看出,當我們使用at時,會進入一個at shell的環境來讓使用者執行工作命令,當命令輸入完成後使用EOF(ctrl+d)來退出該環境。在at中設定工作時,最好使用絕對路徑,這樣可以避免一些不必要的錯誤。
第4章 週期性執行的工作排程
crontab這個命令所設定的工作將會迴圈一直進行下去。可迴圈的時間為分鐘、小時、每週、每月或每年等。crontab除了可以使用命令執行外,也可以編輯/etc/crontab來支援。至於讓crontab可以生效的服務則是crond這個daemon。 我們同樣可以使用service crond status這個命令來檢視cond服務是否開啟:
[[email protected] ~]$ service crond status
crond (pid 2025) is running...
4.1 crontab的工作原理
與at類似,使用crontab命令新建工作排程之後,該項工作就會被記錄到/var/spool/cron/裡面,並且是以賬號來區分,如下所示:
[[email protected] /var/mail]# ls /var/spool/cron/
user1 root nigel
不要使用vim去編輯這些檔案,因為可能會由於輸入語法錯誤導致無法執行cron。 另外,cron執行的每一項工作都會被記錄到/var/log/cron這個日誌檔案中,所以我們可以時常檢視一下該檔案來判斷系統是否別木馬入侵。
4.2 crontab的安全問題
同at一樣,crontab也是通過/etc/cron.allow和/etc/cron.deny這兩個檔案來限制使用者對該命令的使用。讀取順序和優先順序同at一樣。
4.3 crontab語法
crontab的語法如下所示:
crontab [-u username] [-l|-e|-r]
引數:
-u:只能由root使用,將該項排程分配給username。若不帶該引數,則預設為當前使用者的任務排程
-l:列出當前使用者的crontab工作內容
-e:編輯crontab的工作內容。使用該命令後會自動進入vi介面。
-r:刪除當前使用者的所有crontab工作內容。單項工作的刪除通過-e來完成。
4.4 crontab使用示例
使用crontab -e編輯工作檔案,新增如下內容:
41 * * * * echo "Hello World">/dev/pts/12
:wq儲存退出後,等到下一個41分的時候,螢幕上輸出了“Hello World”:
[[email protected] ~]$ crontab -e
crontab: installing new crontab
[[email protected] ~]$ Hello World
4.5 crontab內容解讀
在上例中新增的一行就是一項工作,所有的工作都有固定格式,它們由6個欄位組成,這6個欄位意義如下:
代表意義 | 分鐘 | 小時 | 日期 | 月份 | 周 | 命令 |
---|---|---|---|---|---|---|
數字範圍 | 0~59 | 0~23 | 1~31 | 1~12 | 0~7 | 工作內容 |
輔助欄位說明:
特殊字元 | 代表意義 |
---|---|
* | 代表任何時刻都接受 |
,(逗號) | 表示分隔時段。如要執行的工作是3:00和6:00時,就會是:0 3,6 * * * command |
-(減號) | 代表一段時間範圍內,舉例來說,8~12點的每小時20分都執行:20 8-12 * * * command |
/n(斜線) | n代表數字,即每隔n單位間隔。例如每5分鐘執行一次:*/5 * * * * command |
第5章 系統配置檔案/etc/crontab
crontab -e 是針對使用者來設計的(/usr/bin/crontab可執行檔案),如果是系統的例行性排程,則可以通過修改/etc/crontab(純文字檔案)來實現。 cron這個服務會每分鐘去讀取一次/etc/crontab與/var/spool/cron裡面的資料內容,然後一一判斷,達到了條件的就執行。因此我們新增任務時最小時間單位是分,而且直接修改完檔案,然後儲存就能生效。(有的distribution是將檔案讀入到記憶體,在這種情況下想要立即生效則需要重啟crond這個服務) /etc/crontab的內容如下所示:
SHELL=/bin/bash
2 PATH=/sbin:/bin:/usr/sbin:/usr/bin
3 MAILTO=root
4 HOME=/
5
6 # For details see man 4 crontabs
7
8 # Example of job definition:
9 # .---------------- minute (0 - 59)
10 # | .------------- hour (0 - 23)
11 # | | .---------- day of month (1 - 31)
12 # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
13 # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
14 # | | | | |
15 # * * * * * user-name command to be executed
欄位描述註釋已經說得很清楚了。需要注意的是,這種方式中多了一個user-name欄位,用於指定該工作所屬的使用者。
本文章總結自《鳥哥的linux私房菜 第三版》