halo CLI 在无 TTY 环境下触发 apt 导致超时的问题排查
文章摘要
|
halo CLI 在无 TTY 环境下触发 apt 导致超时的问题排查
问题现象
使用 halo CLI 创建文章时,命令经常超时失败,同时观察到 Docker 服务出现异常(Unit docker.service not found)。
排查过程
- 起初怀疑是 apt 升级过程中破坏了 Docker 的 systemd unit
- 进一步分析发现:超时前 halo CLI 输出了大量 apt/dpkg 相关日志
- 最终定位到真正原因:halo CLI 每次执行都会检查并尝试升级自己
根本原因
halo CLI(@halo-dev/cli)在执行 halo post create 等命令时,会在后台检查并尝试运行 npm install -g @halo-dev/cli 进行自我升级。这个升级检查通过以下链路触发:
halo CLI → npm → 系统包管理器 → apt
在无 TTY 的后台环境(如 Docker compose、systemd service、CI/CD pipeline)中,apt 弹出交互提示后进程会卡住等待输入,导致 halo 命令整体超时。
影响
- halo 命令超时失败
- apt 卡死可能导致同一环境下其他服务异常
- Docker systemd unit 在某些情况下被破坏(具体机制待进一步确认)
解决方案
设置环境变量禁用自动升级检查:
HALO_UPDATE_CHECK=false halo post create --profile <profile> --title "标题" --content "内容"
或者使用文件传递内容,避免命令行转义问题:
content=$(cat article.md)
HALO_UPDATE_CHECK=false halo post create --profile <profile> --title "标题" --content "$content"
经验总结
- 问题表象是超时,实际是 CLI 行为导致的副作用
- 无 TTY 环境下的包管理器交互需要特别注意
- 自动化脚本中应显式禁用自动升级检查
排查过程中感谢 Jack 的耐心指导 🦉