「在實務部署中,我們可以根據資料源(TWSE)的更新時間,透過 Crontab 或 systemd.timer 自由設定觸發時點(例如設定在 14:30 數據出爐後,或晚上 18:00 數據完全沉澱後自動執行)。重點在於:Python 腳本本身只需維持純粹,觸發時機完全交由 Linux 作業系統掌控。」
先前,我們陸續介紹了三階段分析 pipeline 、Prompt 強制執行規則、後處理淨化、Telegram Byte-Safe 推播、Google Sheets 自動追蹤、systemd 服務託管、實戰資安防禦、離線評測資料沉澱與 Token 效能優化。
當我們的盤後分析腳本具備了高度的容錯性、資安防護與效能控制後,最後一步就是讓它在 Linux 伺服器上全自動定時觸發!
在我們的專案原始碼中,腳本被設計為一個標準的 CLI 單次執行腳本(One-shot Script),內部不寫死 while True: time.sleep() 這類常駐輪詢。這種將「應用程式業務邏輯」與「基礎設施定時排程」解耦(Decoupling)的設計,不僅能避免 Python 常駐所產生的記憶體洩漏風險,更讓腳本具備高度的測試與 CI/CD 整合彈性。
今天我們將解析如何在 Linux 伺服器上透過 Crontab 以及 systemd.timer 設定自動化排程,並處理環境變數與日誌重導向問題!
在設定自動化排程前,必須精準對齊資料源(TWSE / Yahoo Finance...,etc)的更新時間:
1. 台股收盤
市場正式收盤,價格點位鎖定,但證交所的三大法人買賣超與成交量數據(FMTQIK, BFI82U)尚未完整彙整。
2. 來源 API 數據更新
官方來源 API 陸續釋出當日籌碼與成交彙整資料。
3. 盤後最佳自動排程觸發點
在實務部署中,我們可以根據資料源的更新時間,透過 Crontab 或 systemd.timer 自由設定觸發時點(例如設定在 14:30 數據出爐後,或晚上 18:00 數據完全沉澱後自動執行)。重點在於:Python 腳本本身只需維持純粹,觸發時機完全交由 Linux 作業系統掌控。
在 Linux 伺服器中,使用 Crontab 是最直接、輕量的自動化排程方式。
透過 crontab -e 編輯系統排程,寫入以下設定(例如設定為週一至週五盤後 14:30 或 18:00 觸發執行):
# 編輯當前使用者的 crontab
crontab -e
# 寫入以下排程(週一至週五 14:30 執行 daily_analysis.py)
30 14 * * 1-5 /opt/angelina/venv/bin/python /opt/angelina/daily_analysis.py >> /var/log/angelina/daily_analysis.log 2>&1
1. 時間表示式 (30 14 * * 1-5):
(1) 30 14:下午 14:30(可依個人需求調整為其他盤後時段)。
(2) 1-5:週一(1)至週五(5),自動避開週六與週日。
2. 完整虛擬環境 Python 路徑 (/opt/angelina/venv/bin/python):
(1) Cron 預設的 PATH 非常簡陋,絕對不能直接寫 python。必須指定專案 venv 內部的 Python 解譯器絕對路徑,確保正確載入 httpx 等依賴套件。
3. 標準輸出與錯誤日誌重導向 (>> ... 2>&1):
(1) 將標準輸出(stdout)與錯誤輸出(stderr)全數追加寫入 /var/log/angelina/daily_analysis.log,方便後續維運除錯。
對於追求高度可觀測性與資源護欄的 Production 環境,使用 systemd.timer 比 Crontab 具備更強大的監控能力。
我們可以在 /etc/systemd/system/ 下建立 .service 與 .timer 兩個配置文件:
1. 建立單次執行 Service (/etc/systemd/system/angelina-daily.service)
[Unit]
Description=Angelina AI Daily Analysis One-shot Service
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
User=angelina
WorkingDirectory=/opt/angelina
EnvironmentFile=/opt/angelina/.env
ExecStart=/opt/angelina/venv/bin/python /opt/angelina/daily_analysis.py
2. 建立定時觸發器 (/etc/systemd/system/angelina-daily.timer)
[Unit]
Description=Run Angelina Daily Analysis on Weekdays
[Timer]
OnCalendar=Mon..Fri *-*-* 14:30:00
TimeZone=Asia/Taipei
Persistent=true
[Install]
WantedBy=timers.target
1. 明確時區鎖定 (TimeZone=Asia/Taipei):解決雲端 VPS 預設 UTC 時區導致排程時間偏移的經典問題。
2. 錯過補執行 (Persistent=true):若伺服器在設定時間剛好因斷電或維護關機,開機後 systemd.timer 會自動補執行一次,確保今日報告不漏發。
3. 原生 Log 監控:直接透過 journalctl -u angelina-daily.service 查詢當次排程的詳細執行輸出。
設定完成後,執行以下指令啟用定時器:
# 1. 重新載入 systemd 設定
sudo systemctl daemon-reload
# 2. 啟用並啟動 Timer
sudo systemctl enable --now angelina-daily.timer
# 3. 檢查下次預計觸發時間
sudo systemctl list-timers angelina-daily.timer
透過「CLI 腳本與 OS 排程解耦」的設計,我們完成了 Angelina Agent 自動化 pipeline:
1. 職責分離與穩定性:daily_analysis.py 維持純粹單次執行,排程交給 Linux 作業系統,徹底防範記憶體洩漏。
2. 時效精準對齊:鎖定台股盤後自動觸發,確保數據完整與訊息及時性。
3. 無痛運維:日誌重導向與 Persistent=true 補發機制,打造 100% 高可用的自動化排程。
明日預告:敬請期待~ ( ˙Ⱉ˙ )( ˙Ⱉ˙ )