跳轉到

臨時操作

排程外需要手動介入的常見情境。所有指令都以 operator user 身份執行。

確認系統現況

操作前先確認各 daemon 狀態:

tapioctl status

再跑全套巡檢:

tapioctl check all

手動補跑盤前檔轉檔(preopen)

適用情境:broker 投檔延誤導致 preopen cron 失敗,檔案後來才到位。

# 1. 確認 broker 投檔目錄與檔案
tapioctl version | grep preopen_src
# 範例輸出:  preopen_src:   /home/sinopac

# 以實際路徑確認檔案已到位且可存取
ls -al /home/sinopac/*.TXT

# 2. 強制重跑 preopen
tapioctl preopen --force

# 3. 重啟(cron 未成功啟動,或需重載新設定)
tapioctl restart live-sync
tapioctl restart core

時間壓力

preopen 若延誤到 08:30 後才完成,留給 Tapio 連線、登入的時間極短。 若已逼近 08:45 開盤,先聯絡交易室評估是否需要延後開盤。

盤前檔轉檔異常,重新過檔

適用情境:tapioctl preopen 已跑完,但轉出的資料有問題(格式錯誤、檔案截斷、人工修正後需重跑),需要強制從 broker 拋檔目錄重新過一次。

# 1. 停止 core 與 live-sync(其他 daemon 與盤前檔無關,不需重啟)
tapioctl stop core
tapioctl stop live-sync

# 2. 重跑 rollover:確認今天的 storage 目錄都已建立(不清資料)
tapioctl rollover

# 3. 強制重跑 preopen:跳過當日已完成護欄,從 preopen_src 重新複製並轉檔
tapioctl preopen --force

# 4. 重新啟動
tapioctl start core
tapioctl start live-sync

--force 的行為

tapioctl preopen --force 會強制從 preopen_src(Tapio.toml [preopen].source_dir)重新複製 *.TXT 到內部目錄並覆寫,等同於從頭跑一次 preopen,但不需要手動清 data/preopen/<system_date>/

手動排查行情

tapio-quote-dump 直接讀 shm,確認特定商品的行情是否已收到:

# 過濾特定商品前綴(例如台指期各月份)
tapio-quote-dump | grep TXF

輸出範例:

[2026-04-21 19:13:02.577] [info] symbol(TXFE6     ) id(1) tick price(380150000) priceLimit(seq=738, up=418520000, down=349190000)
[2026-04-21 19:13:02.594] [info] kind(TXF) price(3760511000)
  • symbol — 商品代碼(含 padding 空白)
  • tick price — 最新成交價(整數格式)
  • priceLimit — 漲跌停價與序號
  • kind(...) 那行 — 該商品類別的彙總資訊

有收到行情但 core 沒看到 → 看 shm ring 是否塞住(可能需要 tapioctl restart quote-receiver,見下方)。

確認 quote-receiver 是否正常

看 stdout log:

tail -f /opt/Tapio/log/current/stdout/quote-receiver.log

正常啟動序列(依序出現):

== start 2026-04-21T17:24:14+08:00 ==
[...] WriterLock: acquired /opt/Tapio/run/quote-writer.lock
[...] QuoteSharedMemory: opening /opt/Tapio/data/quote/quote.shm
[...] priceLimit seqlocks clean on startup
[...] heartbeat time(...) seq(...)
[...] symbol(...) upPrices[...] downPrices[...]   ← 開始收漲跌停資料

啟動後會持續印出各商品漲跌停更新,表示行情流正常接收中。若 log 停在 heartbeat 而沒出現 symbol 那行,代表交易所尚未廣播漲跌停(盤前正常)或多播封包沒收到(需查網路)。

確認 taifex-fetcher 是否正常

看 stdout log:

tail -f /opt/Tapio/log/current/stdout/taifex-fetcher.log

正常啟動序列(依序出現):

2026/04/21 08:59:32 INFO program_root = /opt/Tapio
2026/04/21 08:59:32 INFO system_date = 20260421 (source: file)
2026/04/21 08:59:32 INFO dayDir = /opt/Tapio/data/taifex/20260421
2026/04/21 08:59:32 INFO sftp connected to sftp1.test.taifex:22999
2026/04/21 08:59:33 INFO pulled /opt/P06.10 -> P06.10 (6588 bytes)
2026/04/21 08:59:33 INFO pulled /opt/C01.10.20260421071350242 -> ... (880 bytes)
...
  • sftp connected 出現 → SFTP 連線成功
  • pulled 那行 → 該次拉到有更新的檔案並寫入 dayDir
  • 若本次輪詢交易所端沒有新檔案,不會印 pulled,屬正常

確認 live-sync 是否正常

看 stdout log:

tail -f /opt/Tapio/log/current/stdout/live-sync.log

正常啟動序列(依序出現):

[...] system_date read from file = (20260421)
[...] [start] SinoPac_LiveSync — 監看永豐金即時餘額變動並通知 Gateway
[...] [lock-held] /opt/Tapio/storage/persistent/.sinopac_handler.lock
[...] [startup-rehydrate] seenSourceRefs_ from persistent: N entries
[...] [watch] 開始監看目錄: /home/sinopac
[...] [grpc-target] GatewayAdmin gRPC target: 127.0.0.1:6001
[...] [addOneWatchDir] watch: /home/sinopac/...   ← 各子目錄逐一加入監看
[...] [new-file] 偵測到新檔案: UpdatedBalanceSt....txt
[...] [dedup-skip] UpdatedBalanceSt....txt already processed

關鍵訊號說明:

  • lock-held — 確認取得寫入鎖,沒有其他 live-sync 同時在跑
  • startup-rehydrate — 從 persistent 讀回已處理記錄(去重複用)
  • watch + grpc-target — 監看目錄與通知目標都確認了
  • 啟動時大量 [new-file] 後接 [dedup-skip]正常,每次啟動都會重新掃描整個目錄,靠內部去重複避免重複通知

盤中若有真正的新通知檔到達,會看到 [new-file]沒有 [dedup-skip],代表該筆餘額更新正在處理。

重啟單一 daemon

盤中重啟 tapio-quote-receiver(行情異常):

# 一般重啟:不清 shm ring,殘留行情會保留在檔案裡,
# 不需重新等廣播;quote-receiver 啟動時會自動執行檔案修復檢查。
tapioctl restart quote-receiver

若確定 shm ring 本身損壞(例如資料嚴重錯亂),才加 quote-clean

tapioctl stop quote-receiver
tapioctl quote-clean
tapioctl start quote-receiver
# 注意:清完 ring 後需等交易所重新廣播才能收齊行情

盤中重啟 tapio-mail(郵件卡住):

tapioctl restart mail

盤中重啟 core

tapioctl restart core 會終止所有 in-flight order 並重置 session。 盤中除非緊急,否則不要做;需與交易室確認後再執行。

緊急停機

立刻停掉所有 daemon(不管當前交易狀態):

tapioctl down

或逐一停止:

tapioctl stop core
tapioctl stop live-sync
tapioctl stop taifex-fetcher
tapioctl stop quote-receiver
tapioctl stop mail

若某個 daemon 無回應:

tapioctl status                # 確認 PID
kill -9 <pid>                  # 強制砍掉
rm /opt/Tapio/run/core.pid          # 清 stale pidfile

手動 rollover(補跑)

若 cron 的 rollover 沒跑(cron 失敗、機器重開機等):

# 確認目前 system_date 是昨天
cat /opt/Tapio/storage/system_date

# 補跑(前提:所有 daemon 都已 stop)
tapioctl rollover

# 確認
cat /opt/Tapio/storage/system_date
readlink /opt/Tapio/storage/current

必須先 stop 所有 daemon

有 daemon 在跑時跑 rollover,該 daemon 的後續 log 會寫進新日期目錄, 但 daemon 本身的 session 狀態仍是昨天的。此時的資料可信度低,建議重啟。

查 log

# tapio-core 今天的 spdlog
ls -t /opt/Tapio/log/$(cat /opt/Tapio/storage/system_date)/tapio-core.*.txt | head -1 | xargs tail -f

# 今天的 stdout(崩潰前訊息在這)
tail -f /opt/Tapio/log/$(cat /opt/Tapio/storage/system_date)/stdout/tapio-core.log

# tapio-quote-receiver
tail -f /opt/Tapio/log/$(cat /opt/Tapio/storage/system_date)/stdout/tapio-quote-receiver.log