排程是什麼 ?
排程就是將工作安排執行的流程或時間的意思,在工作中或現實生活中大概是分為兩種,本篇要介紹的是以 crontab 為主,且 Linux 中也提供兩種不同的指令和使用法。
一種是例行性的就是每隔一定的週期要來辦的事項:適合用 crontab
這個指令所設定的工作將會循環的一直進行下去。
一種是突發性的,或是一次性的:適合用 at
僅執行一次就結束排程的指令。
crontab 指令教學與範例
每一位使用者都有自己的 crontab
排程,可以使用下列指令查看
:
# 查看自己的 crontab crontab -l # 查看指定使用者edward 的 crontab sudo crontab -u edward -l # 編輯自己的 crontab 內容 crontab -e # 編輯指定使用者edward 的 crontab crontab -u edward -e # 刪除 crontab 內容 crontab -r
crontab 設定解說
0 12 * * * command #分 時 日 月 週 command
特殊字符 | 說明 |
*(星號) | 代表任何時刻都接受的意思!舉例來說,範例一內那個日、月、週都是 * , 就代表著『不論何月、何日的禮拜幾的 12:00 都執行後續指令』的意思! |
,(逗號) | 代表分隔時段的意思。舉例來說,如果要下達的工作是 3:00 與 6:00 時,就會是:0 3,6 * * * command 時間參數還是有五欄,不過第二欄是 3,6 ,代表 3 與 6 都適用! |
-(減號) | 代表一段時間範圍內,舉例來說, 8 點到 12 點之間的每小時的 20 分都進行一項工作:20 8-12 * * * command 仔細看到第二欄變成 8-12 喔!代表 8,9,10,11,12 都適用的意思! |
/n(斜線) | 那個 n 代表數字,亦即是『每隔 n 單位間隔』的意思,例如每五分鐘進行一次,則: */5 * * * * command 很簡單吧!用 * 與 /5 來搭配,也可以寫成 0-59/5 ,相同意思! |
不過通常是沒有人會特別去記住,所以這裡也提供一段註解可以先置入在檔案內喔
# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
本段落引用 鳥哥Linux私房菜
crontab 設定範例
以下是一些最基本的 crontab
設定範例。
# 每天8:30 30 8 * * * /home/edward/cil/script.sh # 每週日18:30 30 18 * * Sun /home/edward/cil/script.sh # 每年1月22日8:30 30 8 22 1 * /home/edward/cil/script.sh # 每月初一、十五 8:30 30 8 1,15 * * /home/edward/cil/script.sh # 每隔 10 分鐘一次 */10 * * * * /home/edward/cil/script.sh # 每2分鐘執行一次,整點就執行 只做7-23時 */2 7-23 * * * /home/edward/cil/script.sh > /dev/null 2>&1
什麼是/dev/null
? 取消不要的輸出項目
有注意到上述的範例中 /dev/null
嗎? 當有執行成果或者是執行的項目中有輸出的資料時,該資料將會 mail 給 MAILTO 設定的帳號。 2>&1
是將出錯不輸出在螢幕上而是導向到 /dev/null
。最後一個& , 是讓該命令在後臺執行,但若將指定的 &1
變更成 1
,就是 螢幕輸出(stdout)
。
特殊排程規則
還有很方便的參數,一次取代全部五個數字參數
參數 | |
@reboot | 僅在開機的時候執行一次。 |
yearly | 一年執行一次,和0 0 1 1 * 效果一樣 |
annually | (和@yearly 一樣) |
monthly | 一個月執行一次,和0 0 1 * * 效果一樣。 |
weekly | 一個星期執行一次,和0 0 * * 0 效果一樣。 |
daily | 每天執行,和0 0 * * * 效果一樣。 |
midnight | (和@daily 一樣) |
hourly | 每小時執行,和0 * * * * 效果一樣。 |
權限控管的兩種方式
限制 user 執行 sudo 指令的權限
由於系統安全性的考量,我們可能會希望限制只有特定的使用者可以使用 crontab
工作分工的時候,這時候就需要讓這位使用者限制只能使用 sudo crontab 的權限
#打開檔案 vi /etc/sudoers #新增user1使用者權限,來控制只能編輯 crontab 只能下sudo corontab root ALL=(ALL) ALL user1 ALL=(root) /usr/bin/crontab
白名單/etc/cron.allow
與 黑名單 /etc/cron.deny
設定
每一行寫一個帳號名稱,設定方法也很簡單
/etc/cron.allow
如果這個檔案存在,則只有被列在這裡的帳號可以使用 crontab
,其餘帳號皆禁止使用,也就是白名單。/etc/cron.deny
如果這個檔案存在,則被列在這裡的使用者都禁止使用 crontab
,也就是黑名單。如果 /etc/cron.allow
與 /etc/cron.deny
兩個設定檔都不存在,則就只有系統管理者 root
能夠使用 crontab
。
參考資料:鳥哥的 Linux 私房菜、gtwang、mks.tw、code.kpman