MKTalkway
首页
注册

Linux 設定 crontab 例行性工作排程教學與範例

MiKing233
好吃懶做
2022-11-11 13:12:22

本篇介紹如何在 Linux 系統上使用 crontab 工作排程,設定讓系統定時自動執行指定的指令或程式。

 

Linux 的管理者或使用者如果需要定期執行某些指令或程式,最常見的方式就是使用 cron 來幫忙管理例行性工作排程,只要設定好 crontab 設定檔之後,系統就會自動依照設定的時間,定期執行重複性的工作。

 

查看與編輯 crontab

Linux 系統上,每一位使用者都可以自訂自己的 crontab 排程工作,若要查看自己的 crontab 內容,可以使用 crontab 指令加上 -l 參數:

# 查看當前用戶的 crontab

Command #crontab -l

 

如果是系統管理者要查詢特定使用者的 crontab 的話,可以使用 -u 參數指定使用者名稱:

# 查看指定使用者的 crontab

Command #sudo crontab -u miking233 -l

 

若要編輯自己的 crontab 內容,可以加上 -e 參數:

# 編輯 crontab 內容

Command #crontab -e

 

系統管理者若要編輯特定使用者的 crontab 內容,同樣是加上 -u 參數並指定使用者即可:

# 編輯指定使用者的 crontab

Command #crontab -u miking233 -e

 

若要刪除目前所有的 crontab,可以使用 -r 參數:

# 刪除 crontab 內容

Command #crontab -r

 

個人 crontab 設定

在個人的 crontab 設定中,基本上每一行設定就代表一個要定期執行的程式,其格式如下:

Crontab >MIN HOUR DOM MON DOW CMD

 

一行設定包含六個部分,各部分的意義如下:

欄位

說明

可設定的值

MIN

分鐘

0  59

HOUR

小時

0  23

DOM

1  31

MON

月份

1  12, 此欄位亦可用英文簡稱取代, 例如一月也可以寫 Jan.

DOW

星期幾

0(週日)到 6(週六), 7 也代表週日. 此欄位亦可用英文簡稱取代,

例如週日也可以寫 Sun.

CMD

要定期執行的指令

任何可執行的程式或指令稿(包含參數),例如 

/path/to/cmd --your --parameter

 

除了一般的數字之外,crontab 亦可使用一些特殊字元,每個特殊字元都有不同的意義與適用情況:

特殊字元

代表意義

星號(*

代表接受任意時刻,例如若在月份那一欄填入星號,則代表任一月份皆可。

逗號(,

分隔多個不同時間點。例如若要指定 3:006:00 9:00 三個時間點執行指令,就可以在第二欄填入 3,6,9

減號(-

代表一段時間區間,例如若在第二欄填入 8-12 就代表從 8 點到 12 點的意思,也就是等同於 8,9,10,11,12

斜線加數字(/n

n 代表數字,這樣寫的意思就是「每隔 n 的單位」的意思,例如若在第一欄填入 */5 就代表每間隔五分鐘執行一次的意思,也可以寫成 0-59/5

 

由於 crontab 設定的欄位有點多,不常用的人通常都記不住,建議在編輯 crontab 時,可以將以下的註解貼在設定檔內,方便參考。

# ┌───────────── 分鐘   (0 - 59)

# │ ┌─────────── 小時   (0 - 23)

# │ │ ┌─────────      (1 - 31)

# │ │ │ ┌───────      (1 - 12)

# │ │ │ │ ┌───── 星期幾 (0 - 70 是週日,6 是週六,7 也是週日)

# │ │ │ │ │

# * * * * * /path/to/command

 

以下是一些最基本的 crontab 設定範例。

# 每天早上 8 30 分執行

Crontab >30 08 * * * /home/miking233/backup.sh --your --parameter

 

# 每週日下午 6 30 分執行

Crontab >30 18 * * 0 /home/miking233/backup.sh --your --parameter

 

# 每週日下午 6 30 分執行

Crontab >30 18 * * Sun /home/miking233/backup.sh --your --parameter

 

# 每年 6 10 日早上 8 30 分執行

Crontab >30 08 10 06 * /home/miking233/backup.sh --your --parameter

 

# 每月 1 日、15 日、29 日晚上 9 30 分各執行一次

Crontab >30 21 1,15,29 * * /home/miking233/backup.sh --your --parameter

 

# 每隔 10 分鐘執行一次

Crontab >*/10 * * * * /home/miking233/backup.sh --your --parameter

 

# 從早上 9 點到下午 6 點,凡遇到整點就執行

Crontab >00 09-18 * * * /home/miking233/backup.sh --your --parameter

 

系統設定檔

除了一般使用者各自的排程工作之外,的還有一類的是屬於系統的排程工作,這類的設定寫在 /etc/crontab 檔案與 /etc/cron.d/ 目錄下的各個設定檔中。

 

系統的 crontab 設定檔內容跟普通使用者的 crontab 類似,不過多了一個使用者名稱的欄位:

Crontab >MIN HOUR DOM MON DOW USER CMD

 

例如每小時以 miking233 帳號權限執行一次,則可以這樣寫:

# 每小時以 miking233 帳號權限執行一次

Crontab >0 * * * * miking233 /home/miking233/backup.sh --your --parameter

在系統的 crontab 設定檔中,只是多了一個使用者的欄位,其餘的設定方式都跟一般使用者的 crontab 相同。

 

特殊排程規則

crontab 除了以標準的格式撰寫排程工作之外,他也有提供幾個常用的特殊排程規則,這種特殊排程規則都以 @ 開頭,以下是每個特殊排程規則的說明:

排程規則

說明

@reboot

每次重新開機之後,執行一次。

@yearly

每年執行一次,亦即 0 0 1 1 *

@annually

每年執行一次,亦即 0 0 1 1 *

@monthly

每月執行一次,亦即 0 0 1 * *

@weekly

每週執行一次,亦即 0 0 * * 0

@daily

每天執行一次,亦即 0 0 * * *

@hourly

每小時執行一次,亦即 0 * * * *

 

例如每天執行一次,就可以這樣寫:

# 每天執行一次

Crontab >@daily miking233 /home/miking233/backup.sh --your --parameter

 

Email 通知設定

crontab 預設會將執行程式的輸出以 Email 送給執行的使用者,若要更改收件者,可以使用 MAILTO 變數指定:

# 將輸出寄給 miking233(不論這個 crontab 是誰的)

Crontab >MAILTO=miking233

 

# 排程設定

Crontab >30 08 * * * /home/miking233/backup.sh --your --parameter

 

如果不想讓 crontab 寄送任何 Email 出來,可將 MAILTO 設定為空字串:

# 不寄送任何 Email

Crontab >MAILTO=""

 

# 排程設定

Crontab >30 08 * * * /home/miking233/backup.sh --your --parameter

 

執行 Shell

若要更改執行工作的 Shell 環境,可以使用 SHELL 來指定要使用的 Shell

# 設定使用 /bin/sh 執行

Crontab >SHELL=/bin/sh

 

# 排程設定

Crontab >30 08 * * * /home/miking233/backup.sh --your --parameter

 

限制使用者使用 crontab

由於系統安全性的考量,我們可能會希望限制只有特定的使用者可以使用 crontab,這時候就可以透過系統的 /etc/cron.allow /etc/cron.deny 兩個檔案來設定。

/etc/cron.allow

如果這個檔案存在,則只有被列在這裡的帳號可以使用 crontab,其餘帳號皆禁止使用,也就是白名單。

 

/etc/cron.deny

如果這個檔案存在,則被列在這裡的使用者都禁止使用 crontab,也就是黑名單。

 

/etc/cron.allow /etc/cron.deny 設定檔在列出帳號時,語法都相同,每一行寫一個帳號名稱。

如果 /etc/cron.allow /etc/cron.deny 兩個設定檔都不存在,則就只有系統管理者 root 能夠使用 crontab

 

 

 

 

 

參考文章:

G. T. Wang: Linux 設定 crontab 例行性工作排程教學與範例

https://blog.gtwang.org/linux/linux-crontab-cron-job-tutorial-and-examples/