909 字
5 分钟

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.log2>&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:

Terminal window
sudo apt update
sudo apt install screen

CentOS/RHEL:

Terminal window
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:

Terminal window
sudo apt update
sudo apt install tmux

CentOS/RHEL:

Terminal window
sudo yum install tmux
# 或 CentOS 8/RHEL 8+
sudo dnf install tmux

基本用法#

创建会话:

tmux new -s training

tmux 的快捷键是 Ctrl+B(和 screen 的 Ctrl+A 类似)。

脱离会话: Ctrl+B 然后 D

查看会话列表:

tmux ls

恢复会话:

tmux attach -t training

tmux 支持水平/垂直分屏:

  • Ctrl+B 然后 %(垂直分屏)
  • Ctrl+B 然后 "(水平分屏)
  • Ctrl+B 然后 方向键(切换窗格)

滚动查看历史输出: Ctrl+B 然后 [ 进入复制模式,用方向键或 PgUp/PgDn 浏览,q 退出。

关闭会话:

exit

或者:

tmux kill-session -t training

tmux 适合需要多窗口多任务协作的场景。一边看日志,一边执行命令,还能分屏监控多个进程。

该选哪个?#

临时跑个脚本 → nohup 脱离终端就行,不需要管理 → setsid 需要交互、随时恢复 → screen 现代工具、多窗口协作 → tmux

我个人常用 tmux,分屏查看日志特别方便。服务器上跑长时间任务,直接新建个 tmux 会话,网断了随时重连。生产环境的服务管理,推荐用 systemd 或 supervisor,但那是另一个话题了。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Linux VPS 技巧:让进程在后台稳定运行的 4 种方法
https://blog.moewah.com/posts/1678/
作者
GoWah
发布于
2019-05-06
许可协议
CC BY-NC-SA 4.0
最后更新于 2023-01-28,距今已过 1098 天

部分内容可能已过时

Profile Image of the Author
GoWah
Hello, I'm GoWah.
分类
标签
站点统计
文章
160
分类
9
标签
350
总字数
301,106
运行时长
0
最后活动
0 天前

目录