在 Linux 設定 crontab 排程教學與範例
LINUX 實用技巧

在 Linux 設定 crontab 排程教學與範例

排程是什麼 ?

排程就是將工作安排執行的流程或時間的意思,在工作中或現實生活中大概是分為兩種,本篇要介紹的是以 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 私房菜gtwangmks.twcode.kpman

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。