iT邦幫忙

2026 iThome 鐵人賽

DAY 15
0

「在實務部署中,我們可以根據資料源(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 設定自動化排程,並處理環境變數與日誌重導向問題!

本篇重點摘要

  1. 剖析「CLI 應用腳本與 OS 定時排程解耦」的架構優勢與台股盤後資料時效。
  2. 實作 Crontab 自動化排程設定與環境變數、虛擬環境(venv)呼叫路徑。
  3. 實作進階 systemd.timer 定時器組態,達成系統級監控與日誌整合。

一、排程時間點選擇與台股盤後資料時效

在設定自動化排程前,必須精準對齊資料源(TWSE / Yahoo Finance...,etc)的更新時間:

  1. 台股收盤
     市場正式收盤,價格點位鎖定,但證交所的三大法人買賣超與成交量數據(FMTQIK, BFI82U)尚未完整彙整。
  2. 來源 API 數據更新
     官方來源 API 陸續釋出當日籌碼與成交彙整資料。
  3. 盤後最佳自動排程觸發點
     在實務部署中,我們可以根據資料源的更新時間,透過 Crontab 或 systemd.timer 自由設定觸發時點(例如設定在 14:30 數據出爐後,或晚上 18:00 數據完全沉澱後自動執行)。重點在於:Python 腳本本身只需維持純粹,觸發時機完全交由 Linux 作業系統掌控。

二、基礎自動化排程:Crontab 設定實務

在 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,方便後續維運除錯。

三、進階系統級排程:systemd.timer 配置

對於追求高度可觀測性與資源護欄的 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 查詢當次排程的詳細執行輸出。

四、啟用 systemd.timer 與監控

設定完成後,執行以下指令啟用定時器:

# 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% 高可用的自動化排程。

明日預告:敬請期待~ ( ˙Ⱉ˙ )( ˙Ⱉ˙ )


上一篇
【Day 23】效能與成本優化:Gemini API Token 消耗分析與 Rate Limit 應對實務
系列文
打造零成本企業級 AI Agent:以 Gemini 2.5 Flash 構建金融分析助手與維運實戰24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言