臨時操作¶
排程外需要手動介入的常見情境。所有指令都以 operator user 身份執行。
確認系統現況¶
操作前先確認各 daemon 狀態:
再跑全套巡檢:
手動補跑盤前檔轉檔(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,確認特定商品的行情是否已收到:
輸出範例:
[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:
正常啟動序列(依序出現):
== 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:
正常啟動序列(依序出現):
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:
正常啟動序列(依序出現):
[...] 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(郵件卡住):
盤中重啟 core
tapioctl restart core 會終止所有 in-flight order 並重置 session。
盤中除非緊急,否則不要做;需與交易室確認後再執行。
緊急停機¶
立刻停掉所有 daemon(不管當前交易狀態):
或逐一停止:
tapioctl stop core
tapioctl stop live-sync
tapioctl stop taifex-fetcher
tapioctl stop quote-receiver
tapioctl stop mail
若某個 daemon 無回應:
手動 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