0%

[Linux] 使用 crontab 排程

Crontab

Crontab

Crontab 是 Linux 系統內建的工作排程機制,可以依照設定的時間執行例行性工作。

格式說明

在 crontab 文件中,最上方可以設定 crontab 參數:

1
2
3
SHELL=/bin/bash                         # 使用的 shell
PATH=/bin:/sbin:/usr/bin:/usr/sbin # 執行檔搜尋路徑
MAILTO="your_email" # 如果有額外的 stdout, 會 email 到此信箱

接著設定工作排程內容,一行是一項工作排程,每行包含 6 個參數,依序是星期以及要執行的 command,詳細說明如下:

1
2
3
4
5
6
* * * * * <command to be executed>
│ │ │ │ └ 星期 (0-7, 0 和 7 都是星期天)
│ │ │ └── 月 (1-12)
│ │ └──── 日 (1-31)
│ └────── 時 (0-23)
└──────── 分 (0-59)

參數特殊符號意義

  • *: 代表任何時刻都接受。
  • ,: 代表分隔時段。例如: 0 6,18 * * * command, 代表 6 點和 18 點都會執行 command。
  • -: 代表一段時間範圍。例如: 30 12-15 * * * command, 代表從 12 點到 15 點的每個 30 分都會執行 command。
  • /n: 代表每隔 n 單位間隔,n 為一個數字。例如: */10 * * * * command, 代表每隔 10 分鐘執行一次 command。

另外還有一些更方便的參數,可以取代前面 5 個參數:

  • @reboot: 只在開機時執行一次。
  • @yearly: 每年執行一次,等同於 0 0 1 1 * command.
  • @annually: 和 @yearly 一樣。
  • @monthly: 每月執行一次,等同於 0 0 1 * * command.
  • @weekly: 每周執行一次,等同於 0 0 * * 0 command.
  • @daily: 每天執行一次,等同於 0 0 * * * command.
  • @midnight: 和 @daily 一樣。
  • @hourly: 每小時執行一次,等同於 0 * * * * command.

設定 crontab

了解 crontab 文件的內容後,接著撰寫要排程的內容,其中的 command 請使用 絕對路徑 避免錯誤。
通常我會另外寫一個 crontab file, 再透過以下指令來設定 crontab:

1
$ crontab <crontab_file>

但是要注意此方式會完全覆蓋原本的 crontab 內容,如果不想要另外寫一個 crontab file,也可以執行 $ crontab -e 直接編輯此使用者的 crontab 內容,編輯後存檔即可設定好 crontab 排程。

crontab 相關指令

  • $ crontab -l: 列出使用者的 crontab 內容。
  • $ crontab -e: 編輯使用者的 crontab 內容。
  • $ crontab -r: 完全清除使用者的 crontab. (要小心使用!)

crontab 範例

這裡附上 crontab 的範例提供參考:

Ex. 每天 1 點執行 report.sh:

1
2
3
4
5
6
7
8
# crontab_file.txt

SHELL=/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
MAILTO="your_email"

# 分 時 日 月 星期 指令
0 1 * * * sh /home/user/crontab/report.sh

參考資料