海风游戏狂欢季-独家活动首发平台

SSH断开服务即挂问题排查与解决
2026-08-11 07:05:51

SSH 断开服务即挂问题排查#装了个 CLIProxyAPI,SSH 连上去的时候服务好好的,一断开 SSH 就炸了。这个问题很典型,原因其实很简单。

问题现象#

SSH 登录时,服务运行正常

关闭 SSH 后,服务停止

再次 SSH 登录,服务又 “活” 了(其实是重启了)

根本原因#查看安装脚本发现,它把服务安装为了 Systemd 用户服务 (User Service):

Terminal window1# 服务文件放在用户目录下2local systemd_dir="$HOME/.config/systemd/user"3

4# 使用 --user 参数管理5systemctl --user daemon-reload6systemctl --user start cliproxyapi.service问题在于:systemd 用户实例绑定在用户会话上。SSH 登录时会启动用户实例,SSH 断开时会销毁该实例,连带杀掉所有用户服务。

Linux 默认行为就是 “人走茶凉”。

解决方案#立即修复#运行一条命令开启 “逗留模式 (Linger)”:

Terminal window1loginctl enable-linger $(whoami)无需 sudo这个命令不需要 root 权限,它会在 /var/lib/systemd/linger/ 下创建一个以用户名命名的空文件。

验证修复#运行后断开 SSH,等几分钟再连上去检查:

Terminal window1systemctl --user status cliproxyapi如果显示 active (running) 且运行时间超过你断开 SSH 的时长,说明成功了。

确保开机自启#虽然 linger 是永久的,但还要确保服务本身设置了开机自启:

Terminal window1# 检查是否已启用2systemctl --user is-enabled cliproxyapi3

4# 如果没启用,执行5systemctl --user enable cliproxyapi彻底根治(修改安装脚本)#如果想让安装脚本自动处理这个问题,在 create_systemd_service 函数末尾加上:

Terminal window1create_systemd_service() {2 # ... 原有代码 ...3

4 systemctl --user daemon-reload5

6 # 新增:开启 Linger 模式7 if command -v loginctl >/dev/null 2>&1; then8 log_info "Enabling linger for current user..."9 loginctl enable-linger "$USER" || loginctl enable-linger "$(whoami)" || true10 fi11

12 log_success "Systemd service file created"13}其他可能原因#如果上面的方法无效,检查以下几点:

1. SSH 隧道误用#如果你是通过 ssh -L 8080:localhost:8080 这种端口转发访问的服务,断开 SSH 后隧道自然消失。这不是服务挂了,是访问路径断了。

解决: 让服务监听 0.0.0.0 而不是 127.0.0.1,直接通过服务器IP访问。

2. 服务绑定在 Localhost#检查服务配置,确保监听地址是 0.0.0.0:

1# 错误2listen: 127.0.0.1:80803

4# 正确5listen: 0.0.0.0:80803. StandardOutput 配置错误#检查服务文件,确保没有奇怪的 TTY 绑定:

1[Service]2# 错误示例3StandardOutput=tty4

5# 正确配置6StandardOutput=journal排查命令速查#Terminal window1# 查看服务状态2systemctl --user status 服务名3

4# 查看日志5journalctl --user -u 服务名 -e6

7# 查看 linger 状态8ls /var/lib/systemd/linger/9

10# 查看当前用户实例11loginctl show-user $(whoami)12

13# 列出所有用户服务14systemctl --user list-units --type=service总结#

问题解决SSH 断开服务停止loginctl enable-linger 用户名重启后不自动启动systemctl --user enable 服务名外部无法访问检查监听地址是否为 0.0.0.0SSH 隧道断开直接访问服务器IP而非 localhost参考链接#

systemd-logind 文档:https://www.freedesktop.org/wiki/Software/systemd/logind/

loginctl 手册:https://www.freedesktop.org/software/systemd/man/loginctl.html

“会诊”网络歌曲阎肃等痛批《那一夜》恶俗
航天五院503待遇如何,企业编和事业编的区别
最新文章