根本原因是进程绑定原会话而收到sighup被终止;真正需脱离终端控制:setsid创建新会话使进程成为pid 1子进程,彻底脱离会话、进程组和控制终端,最可靠;nohup仅忽略sighup但不脱离会话,适合临时任务。

终端断开后进程自动退出,根本原因是进程仍绑定在原会话中,收到 SIGHUP 信号后被终止。真正要解决的不是“放到后台”,而是让进程脱离终端控制——方法不同,可靠性差异很大。
用 setsid 彻底脱离会话
setsid 创建全新会话,使进程成为 init(PID 1)的直系子进程,不再属于原终端的会话、进程组或控制终端。这是对长期运行工具最可靠的启动方式。
- 标准写法:
setsid ./your-tool.sh > /var/log/tool.log 2>&1(无需加 &,setsid 默认不阻塞) - 验证是否生效:运行
ps -o pid,ppid,sess,pgid,tty -p $(pgrep -f your-tool),确认 PPID 是 1、TTY 显示 ?、sess 和 pgid 与当前终端无关 - 注意:不兼容需要交互式终端的程序(如含
readline或主动检查/dev/tty的脚本),需提前测试
用 nohup 忽略挂断信号
nohup 不改变进程归属,只屏蔽 SIGHUP 信号。适合临时任务或调试阶段,但无法应对终端异常崩溃等边界情况。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 必须显式重定向:
nohup ./script.sh > script.log 2>&1 &;不写重定向时默认写入nohup.out,容易遗漏错误输出 - 进程仍属原 shell 的子进程(PPID 是当前 shell PID),若 ssh 强制断连未触发 clean logout,部分系统可能发送其他终止信号
- 适合已有基础守护逻辑的工具(如自身已 fork + setsid),再套 nohup 反而多余
用 tmux 或 screen 保持交互会话
它们不改变进程本身,而是把整个终端会话虚拟化,断开后会话仍在后台运行,可随时重新连接查看、操作。
- tmux 新建并进入会话:
tmux new -s mytask,运行命令后按Ctrl+B D分离;重连:tmux attach -t mytask - screen 类似:
screen -S mytask→ 运行 →Ctrl+A D→ 重连:screen -r mytask - 优势是支持分屏、多窗口、复制模式;适合需要中途查看日志、调试、人工干预的任务
用 systemd 用户服务实现持久化管理
适合需自动重启、依赖管理、日志集成的生产级工具,由系统级守护进程统一调度,不受用户登录状态影响。
- 创建用户服务文件:
~/.config/systemd/user/mytool.service,定义ExecStart、Restart=always等 - 启用并启动:
systemctl --user daemon-reload && systemctl --user enable --now mytool.service - 日志统一由 journalctl 管理:
journalctl --user -u mytool.service -f - 注意:需确保用户 session 被正确注册(常见于图形环境或启用 linger)










