在完成 Python 腳本開發與命令列操作最佳化後,許多維運與資料採集任務均需在「特定時間」或「固定週期」下自動執行,無需人工手動觸發。例如定時抓取即時報價、每日備份資料庫或清理系統暫存檔案。
Linux 系統中最經典且通用的週期性排程工具為Cron。本篇將說明 Crontab 的語法規則與背景執行邏輯,並示範如何讓虛擬環境中的 Python 腳本定期自動運作,同時將輸出結果正確記錄至日誌檔。
1.Crontab 時間格式與環境隔離陷阱
Cron 服務透過各使用者的排程表(Crontab)來管理定時任務。在設定前,必須理解其時間語法以及背景執行的環境限制。
(1)時間欄位規則
Crontab 的每一行排程設定由六個欄位組成,前五個欄位代表觸發時間,第六個欄位為欲執行的完整命令:
1.第一欄(分鐘):數值範圍為 0 到 59。
2.第二欄(小時):數值範圍為 0 到 23。
3.第三欄(日):數值範圍為 1 到 31。
4.第四欄(月):數值範圍為 1 到 12。
5.第五欄(星期):數值範圍為 0 到 7(其中 0 與 7 均代表星期日)。
6.第六欄(執行命令):要在指定時間執行的系統指令或腳本。
若欄位填寫星號(*),代表「每一個單位時間」,若搭配斜線(例如 */5 在分鐘欄位),則代表「每隔 5 個單位」執行一次。
常用設定範例:
(2)背景執行的三大限制
1.無互動式終端(No TTY):腳本無法接收鍵盤輸入,且所有標準輸出必須明確導向實體日誌檔案,否則無法追蹤排程執行紀錄。
2.極簡環境變數(Minimal PATH):Cron 預設僅具備系統基礎的環境變數,不會自動載入使用者的 Shell 設定檔(如 .bashrc 或 .zshrc)。
3.必須採用絕對路徑:背景執行時預設工作目錄為使用者的家目錄,因此直譯器路徑與腳本檔案均須使用完整絕對路徑指定。
2.取得絕對路徑與修改日誌輸出
(1)取得虛擬環境 Python 與專案目錄絕對路徑
在終端機中執行
which python
pwd
確認取得對應的絕對路徑:
若顯示目前所在的位置是家目錄(/home/ithome),而不是專案目錄。
請先移動至專案資料夾內:
cd ~/projects/demo_project
(2)調整腳本輸出時間戳記
修改 fetch_data.py,加入執行當下的時間戳記,以利後續追蹤排程紀錄:
from datetime import datetime
import requests
def get_crypto_price():
url = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd"
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
data = response.json()
btc_usd = data["bitcoin"]["usd"]
print(f"[{now}] 抓取成功 - BTC: ${btc_usd:,.2f} USD")
except requests.exceptions.RequestException as error:
print(f"[{now}] 請求失敗 - {error}")
if __name__ == "__main__":
get_crypto_price()
3.編輯 Crontab 排程任務
(1)開啟使用者的排程表
在終端機輸入以下指令進入編輯模式
crontab -e
(若初次使用跳出選擇編輯器的提示,請輸入對應數字選擇 nano)
(2)寫入排程規則
在檔案最末端新增以下內容(設定為每 5 分鐘執行一次):
*/5 * * * * /home/ithome/projects/demo_project/.venv/bin/python /home/ithome/projects/demo_project/fetch_data.py >> /home/ithome/projects/demo_project/cron.log 2>&1
指令結構解析:
編輯完成後,按 Ctrl + O 儲存並按 Enter 確認,再按 Ctrl + X 退出編輯器。若終端機顯示crontab: installing new crontab,代表排程已成功套用。
4.驗證與監控執行紀錄
(1)檢視目前已註冊的排程
crontab -l
(2)即時監聽日誌檔案
靜待數分鐘後,可使用 tail 指令動態檢視輸出日誌:
cd ~/projects/demo_project
tail -f cron.log
若排程執行正常,日誌檔案中會定期產出類似如下的輸出:
[2026-09-22 15:40:01] 抓取成功 - BTC: $63,250.00 USD
[2026-09-22 15:45:01] 抓取成功 - BTC: $63,280.50 USD
(可隨時按 Ctrl + C 結束監看)
|明日目標:掌握基礎排程後,明天將介紹 Linux 系統服務管理工具 Systemd,學習如何將自訂腳本打包為正式系統服務,實現開機自動啟動與異常自動重啟機制。|