認識排程與 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 定義時間的精華所在。這五個欄位由左至右分別代表:
- 分鐘 (Minute): 0 到 59
- 小時 (Hour): 0 到 23
- 日期 (Day of month): 1 到 31
- 月份 (Month): 1 到 12
- 星期 (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 小時為你賺錢與工作!