AnyCable-Go 1.5 常用 CLI 命令详解
逐一实测 AnyCable-Go 1.5.6 日常运维命令:--version/--help/--print-config/--config-path/--presets 顶级标志、前台运行与 SIGTERM/SIGHUP 信号行为、systemd 托管、health/broadcast/metrics 三端点 curl 验证与 redis-cli 旁路广播。
AnyCable-Go 1.5 常用 CLI 命令详解
目标:把 AnyCable-Go 1.5.6 日常运维真正用到的命令逐一讲透——
anycable-go二进制的全部顶级标志、前台运行与信号行为、systemd 托管命令、健康/广播/指标三类验证端点、以及 redis-cli 旁路广播。所有命令与回显均已在 Ubuntu 22.04.5 LTS(x86_64)+ AnyCable-Go 1.5.6(1.5.6-e0dd6fa)实测通过;安装见 《Ubuntu 22.04 安装 AnyCable-Go 1.5 指南》,参数含义的完整清单见 《AnyCable-Go 1.5 配置参数详解》。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64),systemd 249
- AnyCable-Go:v1.5.6(1.5.6-e0dd6fa),二进制
/usr/local/bin/anycable-go - 托管方式:systemd 单元
anycable-go.service,EnvironmentFile=/etc/anycable/anycable-go.env - 运行端口:WebSocket/健康检查 8080、HTTP 广播 8090、Prometheus 指标 9091
- 依赖服务:Redis 6.0.16(127.0.0.1:6379)、Ruby RPC 后端(127.0.0.1:50051)
二、工具概览
AnyCable-Go 是单二进制、无子命令的设计:启动服务、查看版本、打印配置全靠顶级标志完成,不存在 anycable-go server / anycable-go config 这类子命令形态。日常运维实际打交道的命令分四类:
| 类别 | 命令 | 用途 |
|---|---|---|
| 二进制标志 | anycable-go --version / --help / --print-config / --config-path / --ignore-config-path / --presets | 版本、帮助、配置核对 |
| 进程控制 | 前台运行 + SIGTERM/SIGHUP/Ctrl-C | 启停与信号行为 |
| systemd 托管 | systemctl start/stop/restart/enable/is-active anycable-go、journalctl -u anycable-go | 生产启停与日志 |
| 验证工具 | curl(health/broadcast/metrics)、redis-cli publish | 运行态验证与旁路广播 |
三、前置条件
确认三服务在运行(每行一个单元,逐个检查),后续命令都以此为基线:
systemctl is-active anycable-go
active
systemctl is-active redis-server
active
systemctl is-active anycable-rpc
active
四、各工具详解
4.1 anycable-go --version:查版本
anycable-go --version
1.5.6-e0dd6fa
输出为「版本号-提交短哈希」,升级核对、提 issue 时都以此为准。
4.2 anycable-go --help:完整标志清单
anycable-go --help
输出节选(实测首尾;完整输出 130+ 行,按 17 个功能分组):
NAME:
anycable-go - AnyCable-Go, a real-time server for https://anycable.io
USAGE:
anycable-go [global options]
VERSION:
1.5.6-e0dd6fa
GLOBAL OPTIONS:
--config-path value Path to the TOML configuration file
--help, -h show help
--ignore-config-path Ignore configuration files (default: false)
--print-config Print configuration and exit (default: false)
--version, -v print the version
...
--statsd_host value Server host for metrics sent to statsd server in the format <host>:<port> [$ANYCABLE_STATSD_HOST]
--statsd_prefix value Statsd metrics prefix (default: "anycable_go.") [$ANYCABLE_STATSD_PREFIX]
--statsd_tags_format value One of "datadog", "influxdb", or "graphite" (default: "datadog") [$ANYCABLE_STATSD_TAGS_FORMAT]
每个标志行尾方括号内就是对应环境变量(如 --rpc_host → $ANYCABLE_RPC_HOST),这是查「某参数的环境变量名」最快的方式。60+ 个功能标志的含义逐组详解见 《AnyCable-Go 1.5 配置参数详解》 第四章。
传了不存在的标志时的报错形态(实测):
anycable-go --nope
Incorrect Usage: flag provided but not defined: -nope
NAME:
anycable-go - AnyCable-Go, a real-time server for https://anycable.io
4.3 anycable-go --print-config:打印生效配置后退出
合并 CLI/环境变量/配置文件后的最终生效配置,打成完整 TOML 输出并直接退出、不启动服务(实测退出码 0):
anycable-go --print-config > /dev/null 2>&1; echo "退出码=$?"
退出码=0
这是排障第一命令:任何「配置没生效」的怀疑,先用与实际启动相同的环境跑一遍 --print-config 核对。用法细节与优先级实验见 《AnyCable-Go 1.5 配置参数详解》 第三章。
4.4 --config-path 与 --ignore-config-path:配置文件的显式控制
# 显式指定 TOML 配置文件
anycable-go --config-path /etc/anycable/anycable-go.toml
# 彻底关闭配置文件自动搜索(防当前目录残留 anycable.toml 造成灵异配置)
anycable-go --ignore-config-path
⚠️ 1.5.6 的自动搜索只覆盖当前工作目录的
anycable.toml(实测见配置篇 3.2 节);systemd 托管下工作目录不可控,生产环境要么显式--config-path,要么加--ignore-config-path纯用环境变量。
4.5 --presets:平台预设组合
anycable-go --presets broker
可选值 none、fly、heroku、broker(逗号分隔可叠加),一键套用对应平台/形态的推荐参数组合;不设时按环境自动推断。
4.6 前台运行与开发模式
排障时经常需要前台起一个临时实例看日志。指定非冲突端口即可与运行中的服务并存:
anycable-go --port 18081 --broadcast_adapter http --http_broadcast_port 18082
启动日志节选(实测):
2026-10-25 03:49:38.982 INF Starting AnyCable 1.5.6-e0dd6fa (pid: 10371, open file limit: 524288, gomaxprocs: 6) nodeid=S5F6Ij
2026-10-25 03:49:38.982 INF Using channels router: $pubsub nodeid=S5F6Ij
2026-10-25 03:49:38.982 INF Using no-op (legacy) broker nodeid=S5F6Ij
2026-10-25 03:49:38.982 INF Accept broadcast requests at http://localhost:18082/_broadcast (no authorization) nodeid=S5F6Ij context=broadcast provider=http
2026-10-25 03:49:38.982 INF RPC controller initialized: localhost:50051 (concurrency: 28, impl: grpc, enable_tls: false, proto_versions: v1, proxy_headers: cookie, proxy_cookies: <all>) nodeid=S5F6Ij context=rpc
本机开发可用 --public 一把梭(关闭全部鉴权):
anycable-go --public --broadcast_adapter=http --port 18083 --http_broadcast_port 18084
2026-10-25 03:49:57.402 WRN Server is running in the public mode nodeid=LiZ7NO
2026-10-25 03:49:57.402 INF Accept broadcast requests at http://localhost:18084/_broadcast (no authorization) nodeid=LiZ7NO
2026-10-25 03:49:57.402 INF Handle WebSocket connections at http://localhost:18083/cable nodeid=LiZ7NO
启动即打出 WRN Server is running in the public mode 警告——该模式严禁用于生产,仅限本机联调。
4.7 信号行为:SIGTERM 优雅停机、SIGHUP 致命
对前台实例发 SIGTERM,实测 2ms 内干净退出(无活动连接时),退出码 0:
2026-10-25 03:49:39.982 INF Shutting down... (hit Ctrl-C to stop immediately or wait for up to 30s for graceful shutdown) nodeid=S5F6Ij
2026-10-25 03:49:39.982 INF all active RPC calls finished nodeid=S5F6Ij context=rpc
日志提示很明确:再按一次 Ctrl-C(即第二个 SIGINT)可立即强停,否则在 --shutdown_timeout(默认 30 秒)内排空连接与 RPC 后退出。
⚠️ SIGHUP 不是热重载,会直接杀死进程。实测对前台实例
kill -HUP后进程立即退出(shell 报Hangup)。AnyCable-Go 不支持信号热重载配置,改配置只能systemctl restart anycable-go;千万不要照搬 Nginx 的kill -HUP习惯。
4.8 systemd 托管命令(生产日常)
# 启动 / 停止 / 重启(改配置后必做)
systemctl start anycable-go
systemctl stop anycable-go
systemctl restart anycable-go
# 开机自启(安装时已执行一次,无需重复)
systemctl enable anycable-go
# 存活检查(每行一个单元)
systemctl is-active anycable-go
active
跟踪实时日志:
journalctl -u anycable-go -f
看最近若干行(定位启动失败最有用):
journalctl -u anycable-go --no-pager -n 3
Oct 25 02:54:23 anycable-server anycable-go[10072]: 2026-10-25 02:54:23.291 INF Handle health requests at http://0.0.0.0:8080/health nodeid=HPd4VX
Oct 25 02:54:23 anycable-server anycable-go[10072]: 2026-10-25 02:54:23.292 INF Serve metrics at http://0.0.0.0:9091/metrics nodeid=HPd4VX context=metrics
Oct 25 02:54:23 anycable-server anycable-go[10072]: 2026-10-25 02:54:23.293 INF subscribed to Redis channel nodeid=HPd4VX context=broadcast provider=redis channel=__anycable__
4.9 curl 三端点验证(health / broadcast / metrics)
健康检查(注意返回体是个彩蛋——Bee Gees 歌词,属正常行为):
curl -s -w "\nHTTP %{http_code}\n" http://127.0.0.1:8080/health
Ah, ha, ha, ha, stayin' alive, stayin' alive.
HTTP 200
HTTP 广播(当前服务器配置了 broadcast_key=q1w2e3r4,不带密钥 401、带密钥 201):
curl -s -o /dev/null -w "%{http_code}\n" -X POST http://127.0.0.1:8090/_broadcast \
-H "Content-Type: application/json" \
-H "Authorization: Bearer q1w2e3r4" \
-d '{"stream":"t/1","data":"{}"}'
201
Prometheus 指标:
curl -s http://127.0.0.1:9091/metrics | head -5
# HELP anycable_go_rpc_error_total The total number of failed RPC calls
# TYPE anycable_go_rpc_error_total counter
anycable_go_rpc_error_total 0
4.10 redis-cli 旁路广播
启用了 redis 广播适配器时,可绕过 HTTP 端点直接向 Redis 频道投递,验证整条 Redis→客户端链路:
redis-cli publish __anycable__ '{"stream":"cli/demo","data":"{\"text\":\"hi\"}"}'
1
返回值 1 表示有 1 个订阅者(即 anycable-go 进程)收到了这条广播;若返回 0 则说明 anycable-go 的 Redis 订阅没建立,回看启动日志中是否有 subscribed to Redis channel 行。
五、注意事项
- 改配置只能 restart:AnyCable-Go 不支持热重载,SIGHUP 会杀死进程(4.7 实测);
systemctl reload同样不可用。 - 危险区三标志:
--public(关全部校验)、--noauth(关连接鉴权)、不设broadcast_key的 HTTP 广播端点——三者任何组合出现在生产都是事故,启动日志的WRN/(no authorization)字样是最后防线。 --print-config不启动服务:它打印配置后退出(退出码 0),别拿它当「试运行」——它确实做到了「试配置」,但不会监听端口。- 临时实例避让端口:前台起第二个实例必须换
--port与--http_broadcast_port,否则与运行中的服务抢端口直接失败。 - 标志拼写双形态并存:
--rpc_host(下划线)与--max-conn(连字符)都是合法拼写,照抄--help输出即可,不要自行换算。
六、常见问题
Q1:anycable-go 启动后立即退出、无报错?
大概率是当前工作目录存在 anycable.toml 且内容把它指到了被占用的端口,或配置来源叠加异常。先用 anycable-go --print-config 核对生效值(4.3),必要时加 --ignore-config-path 排除配置文件干扰(4.4)。
Q2:如何确认 RPC 后端连上了?
看启动日志的 RPC controller initialized 一行(完整样例见 4.6);指标端点中 anycable_go_rpc_error_total 持续增长则说明 RPC 调用在失败。
Q3:systemctl reload anycable-go 为什么没效果/服务挂了?
AnyCable-Go 不支持热重载(见 4.7 与注意事项 1)。改配置一律 systemctl restart anycable-go,重启对客户端的影响由断线恢复机制兜底(history/sessions 参数见配置篇 5.4)。
Q4:只想验证广播端点鉴权是否生效?
用 4.9 的 curl:期望「无密钥 401、带 Authorization: Bearer q1w2e3r4 201」。若两者都 201,说明 broadcast_key 没配上;都 401 则检查密钥是否一致。
Q5:redis-cli publish 返回 0?
说明没有订阅者:anycable-go 未启用 redis 适配器、连的不是同一台 Redis、或频道名被改(默认 __anycable__)。对照启动日志 subscribed to Redis channel 行逐项排查。