Linux VPS 技巧:让进程在后台稳定运行的 4 种方法
SSH 连上远程服务器跑个任务,结果网断了,任务也跟着挂。这种经历太常见。
Unix 早期,终端通过 modem 连接系统,用户 logout 时 modem 挂断电话,终端收到 hangup 信号,关闭所有子进程。现在网络不稳定,照样触发这个信号。

那么,怎么让命令提交后不受终端关闭的影响?几种方案各有适用场景。
1. nohup - 最简单的临时方案
nohup 让程序忽略 hangup 信号。输出默认写到 nohup.out,当前目录写不下就写到 $HOME/nohup.out。
nohup python train.py > output.log 2>&1 &需要后台稳定跑个脚本,这个够用。输出重定向到 output.log,2>&1 把标准错误也合并进去。末尾的 & 让程序立即放后台。
缺点也很明显:只能忽略 hangup 信号,如果脚本本身需要交互就不行。没有会话管理功能,只能通过 ps 和 kill 来管理进程。
nohup 是系统自带工具,所有 Linux 发行版都内置。
2. setsid - 创建独立会话
setsid 创建新会话,进程的父进程变成 init(pid 1),不再属于当前终端。
setsid python server.py > server.log 2>&1 &比 nohup 更彻底,整个会话都脱离了终端。ps -ef 查看会发现 ppid 是 1。
注意输出必须手动重定向,setsid 不会帮你处理。适合那些不需要终端交互、纯后台运行的服务。
setsid 也是系统自带工具,无需安装。
3. screen - 经典终端复用器
screen 比 nohup/setsid 强大得多。它创建虚拟终端,里面可以跑多个窗口,网络断了也能恢复会话。
安装
Debian/Ubuntu:
sudo apt updatesudo apt install screenCentOS/RHEL:
sudo yum install screen# 或 CentOS 8/RHEL 8+sudo dnf install screen基本用法
创建会话:
screen -S training在 screen 里面正常执行命令。需要临时离开:
Ctrl+A 然后 D
会话脱离,程序继续在后台跑。
查看所有会话:
screen -ls重新连接:
screen -r training如果忘了会话名称,screen -ls 会列出所有,用 PID 或名字都能恢复。
关闭会话:
exit或者先 detach 再用 screen -X -S training quit 杀掉。
screen 最适合需要交互式命令的场景。训练模型、编译代码、跑测试,用 screen 可以随时离开回来,不用任务管理。
4. tmux - 现代终端复用器
tmux 是 screen 的现代替代品,功能更丰富,配置更灵活。窗口、窗格、会话三级管理,操作更直观。
安装
Debian/Ubuntu:
sudo apt updatesudo apt install tmuxCentOS/RHEL:
sudo yum install tmux# 或 CentOS 8/RHEL 8+sudo dnf install tmux基本用法
创建会话:
tmux new -s trainingtmux 的快捷键是 Ctrl+B(和 screen 的 Ctrl+A 类似)。
脱离会话:
Ctrl+B 然后 D
查看会话列表:
tmux ls恢复会话:
tmux attach -t trainingtmux 支持水平/垂直分屏:
Ctrl+B然后%(垂直分屏)Ctrl+B然后"(水平分屏)Ctrl+B然后方向键(切换窗格)
滚动查看历史输出:
Ctrl+B 然后 [ 进入复制模式,用方向键或 PgUp/PgDn 浏览,q 退出。
关闭会话:
exit或者:
tmux kill-session -t trainingtmux 适合需要多窗口多任务协作的场景。一边看日志,一边执行命令,还能分屏监控多个进程。
该选哪个?
临时跑个脚本 → nohup 脱离终端就行,不需要管理 → setsid 需要交互、随时恢复 → screen 现代工具、多窗口协作 → tmux
我个人常用 tmux,分屏查看日志特别方便。服务器上跑长时间任务,直接新建个 tmux 会话,网断了随时重连。生产环境的服务管理,推荐用 systemd 或 supervisor,但那是另一个话题了。
推荐文章
基于标签匹配 · 智能推荐支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
部分内容可能已过时
喵斯基部落