整点在线推 Telegram,并带上搬运管道的新鲜度
执行器活着不代表链路活着——搬运死了一样心跳正常、一样什么都不做。 所以每小时那条必须读 ship_alive.json:ssh 是否在连、文件是否还在刷。 连上/断开立刻落盘,不靠 5 分钟心跳,否则第一轮会误报上游断了。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -113,8 +113,10 @@ journalctl -u chan-live-ship -f # 搬运日志
|
||||
|
||||
**Telegram** 在 `live.env` 里填 `TG_TOKEN` / `TG_CHAT` 就开。启动时会推一条
|
||||
"执行器启动",兼作通道自检——配错了当场就知道,而不是等几小时后第一个真信号
|
||||
来时才发现。推开仓、平仓(带已实现盈亏)、被硬约束挡住、报错、对账平仓、跨日
|
||||
结算;不推信号过期跳过(常态)和心跳。约 30 条/天上限。
|
||||
来时才发现。之后每小时一条在线(`TG_HB_MIN`,默认 60),带建仓数、当日盈亏
|
||||
和搬运 ssh 新鲜度——执行器活着不代表上游还在投信号。推开仓、平仓(带已实现
|
||||
盈亏)、被硬约束挡住、报错、对账平仓、跨日结算;不推信号过期跳过(常态)和
|
||||
5 分钟日志心跳。约 55 条/天上限。
|
||||
|
||||
## 停机与回滚
|
||||
|
||||
@@ -140,6 +142,8 @@ cd /opt/chan && sudo git reset --hard <sha> && sudo systemctl restart chan-live-
|
||||
| 启动即 `40018` / 签名错 | 出口 IP 不在白名单,或密钥抄错。`curl https://api.ipify.org` 对一下 |
|
||||
| 搬运日志 `Permission denied (publickey)` | 第 3 步的 pubkey 没加到采集机 |
|
||||
| 搬运在线但一直没信号 | 采集机没重启过(`signal_bus.emit` 没加载),或对端总线路径不对 |
|
||||
| Telegram 在线报「读不到搬运」 | 搬运没起,或还是没落 `ship_alive.json` 的旧版本,两边一起重启 |
|
||||
| Telegram 在线报「ssh 已断开」 | 采集机 ssh 断了,搬运在重连。看 `chan-live-ship` 日志 |
|
||||
| 日志 `⛔ 时间倒流 Xs` | 两机时钟不同步,**staleness 闸已不可信**。查两边 `chronyc tracking` |
|
||||
| 信号收到但都被跳过 | `age > LIVE_STALE_S`。看是搬运慢还是时钟偏;也可能是重连重放的旧信号(这种跳过是对的) |
|
||||
| `systemctl status` 显示 start-limit-hit | 5 分钟内重启 5 次,systemd 停手了。先看 journal 找真因,再 `systemctl reset-failed` |
|
||||
|
||||
@@ -59,10 +59,13 @@ LIVE_WATCH_S=10
|
||||
# https://api.telegram.org/bot<TOKEN>/getUpdates 看 result[0].message.chat.id
|
||||
#
|
||||
# 留空则完全不推(不报错)。推的内容:开仓、平仓(带已实现盈亏)、被硬约束
|
||||
# 挡住、报错、对账平仓、跨日结算、启动与停机。
|
||||
# **不推**信号过期跳过(常态,搬运重连会重放旧信号)和心跳(日志里有)。
|
||||
# 量级约 30 条/天上限。
|
||||
# 挡住、报错、对账平仓、跨日结算、启动与停机、整点在线。
|
||||
# **不推**信号过期跳过(常态,搬运重连会重放旧信号)和 5 分钟日志心跳。
|
||||
# 量级约 55 条/天上限(含 24 条在线)。
|
||||
TG_TOKEN=
|
||||
TG_CHAT=
|
||||
# 前缀,用来和采集机推的手工信号区分开——两边可以共用同一个 bot 和对话
|
||||
TG_TAG=实盘
|
||||
# 整点在线的间隔(分钟)。0 关掉。60 = 每天 24 条,和成交推送量级相当。
|
||||
# 这条必须带上游新鲜度:执行器活着不代表链路活着
|
||||
TG_HB_MIN=60
|
||||
|
||||
@@ -84,6 +84,28 @@ else
|
||||
echo " 还没有成交记录"
|
||||
fi
|
||||
|
||||
hr "搬运存活文件"
|
||||
if [[ -f "$STATE/ship_alive.json" ]]; then
|
||||
python3 - "$STATE/ship_alive.json" <<'PY'
|
||||
import json, sys, time
|
||||
d = json.load(open(sys.argv[1]))
|
||||
age = time.time() - d.get("ts", 0)
|
||||
up = d.get("up_s", 0)
|
||||
conn = d.get("connected")
|
||||
if age > 720:
|
||||
state = f"⛔ 已停更 {age/60:.0f} 分钟,进程可能死了"
|
||||
elif conn is False:
|
||||
state = "⛔ ssh 已断开,正在重连"
|
||||
elif conn is True:
|
||||
state = f"ssh 在线 {up/60:.0f} 分钟"
|
||||
else:
|
||||
state = "文件是旧格式(没有 connected),重启搬运后才会有"
|
||||
print(f" {state} · 重连 {d.get('n_reconnect', 0)} 次 · 新增 {d.get('n_new', 0)} 条")
|
||||
PY
|
||||
else
|
||||
echo " 还没有 ship_alive.json(搬运没起来,或还是没落盘的旧版本)"
|
||||
fi
|
||||
|
||||
hr "搬运心跳(最近 3 条)"
|
||||
journalctl -u chan-live-ship -n 200 --no-pager 2>/dev/null \
|
||||
| grep -F "[心跳]" | tail -3 | sed 's/^/ /' \
|
||||
|
||||
Reference in New Issue
Block a user