1. 程式人生 > >Linux定時執行任務——例行性工作排程

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私房菜 第三版》