認識排程與 Linux Crontab 語法入門

當你寫好了一隻可以「自動抓取股票資訊」的 Python 爬蟲,或是「自動寄送對帳單」的 Node.js 程式後,你一定會遇到一個問題:我總不能每天手動去點擊執行它吧?

這時候,我們就需要用到「自動化排程 (Cronjob / Scheduled Tasks)」。

什麼是排程任務 (Cronjob)?

排程任務的概念非常簡單,就像是你手機裡的「鬧鐘」。你可以設定在每天的早上 8:00、每個小時的整點、或是每個星期一的下午 3:00,告訴電腦:「時間到了,請幫我執行這段程式碼」。

在軟體工程界,最經典且被廣泛使用的排程工具,就是 Linux 作業系統內建的 cron 守護行程 (Daemon)。而我們用來設定 cron 任務的語法與檔案,就稱為 Crontab (Cron Table)。

Crontab 的魔法五顆星

如果你曾經看過別人的排程設定,一定會看到類似像下面這種神秘的亂碼:

* * * * * /usr/bin/python3 /home/user/my_script.py

這前面看似亂碼的「五顆星星」,其實就是 Crontab 定義時間的精華所在。這五個欄位由左至右分別代表:

  1. 分鐘 (Minute): 0 到 59
  2. 小時 (Hour): 0 到 23
  3. 日期 (Day of month): 1 到 31
  4. 月份 (Month): 1 到 12
  5. 星期 (Day of week): 0 到 7 (0 和 7 都代表星期天)

常用時間設定範例

[!TIP] 記不住沒關係!業界工程師在寫 Crontab 時,通常都會開啟 crontab.guru 這個網站。它能把五顆星星自動翻譯成人類看得懂的語言,非常方便!

以下是幾個最常用的實戰範例:

1. 每分鐘執行一次

* * * * *

(非常適合用來寫確保伺服器沒有當機的 Ping 腳本)

2. 每小時的整點執行一次

0 * * * *

3. 每天早上 8 點 30 分執行一次

30 8 * * *

(適合用來每天早上發送「早安問候」或是「今日天氣預報」到 Line 群組)

4. 每個星期一的早上 9 點執行一次

0 9 * * 1

5. 每 5 分鐘執行一次 (使用斜線表示頻率)

*/5 * * * *

在 Mac 或 Linux 實作你的第一個 Crontab

如果你是使用 Mac 或是任何 Linux 系統(包含樹莓派),系統都已經內建好 cron 了,你完全不需要安裝任何東西。

第一步:打開 Crontab 編輯器

請打開你的終端機 (Terminal),輸入以下指令來編輯你的排程表:

crontab -e

如果你是第一次執行,系統可能會問你要用哪個編輯器(例如 Nano 或 Vim)。新手建議選擇 Nano,比較直覺。

第二步:寫入排程與腳本路徑

假設我們有一個 Python 腳本放在 ~/Documents/auto_email.py,我們希望每天晚上 10 點執行它:

在編輯器中加入這一行:

0 22 * * * /usr/bin/python3 ~/Documents/auto_email.py >> ~/Documents/cron_log.txt 2>&1

細節解析:

  • 0 22 * * *:代表每天的 22:00。
  • /usr/bin/python3:在 Crontab 中,強烈建議使用絕對路徑!因為 Crontab 執行的環境跟你的終端機不同,可能找不到 python 在哪裡。
  • ~/Documents/auto_email.py:你的腳本位置。
  • >> ~/Documents/cron_log.txt 2>&1:這是個非常實用的進階技巧!Crontab 預設在背景執行,如果程式報錯,你完全不會知道。這段指令會把程式的 print() 輸出與所有錯誤訊息,紀錄到 cron_log.txt 檔案中,方便你 Debug。

第三步:存檔離開

儲存檔案後,終端機會顯示: crontab: installing new crontab

恭喜!你的自動化腳本已經啟動了!只要你的電腦不關機,系統就會在每天晚上 10 點準時幫你發信!

為什麼我們還需要學別的工具?

雖然 Crontab 非常強大,但它有一個致命的缺點:你的電腦必須 24 小時開機

如果你把排程寫在自己的筆電上,只要你一蓋上螢幕,排程就不會跑了。如果要為了一個小腳本去租一台每個月好幾百塊的雲端主機 (VPS) 來跑 Crontab,又顯得太浪費錢。

因此,在接下來的章節中,我們將教你如何使用 完全免費的雲端排程神器,把你的腳本丟上雲端,從此你連電腦都不用開,也能讓它 24 小時為你賺錢與工作!