结论:tmux比screen更稳、可扩展,适合多任务分屏;screen上手快,适合单任务保活;二者均优于nohup。关键操作需注意两段式快捷键(如Ctrl+A后松开再按D)、会话名规范(小写+下划线、勿空格)、命名与连接参数严格一致。

直接说结论:用 screen 最快上手,适合单任务保活;用 tmux 更稳、更可扩展,尤其当你需要分屏看日志+敲命令+查状态时,别犹豫,选 tmux。
screen -S 名字后按 Ctrl+A 再按 D,不是 Ctrl+A+D 同时按
这是新手最常卡住的点。很多人死记“Ctrl+A+D”,结果连按三键没反应——因为 screen 的快捷键是两段式:先按 Ctrl+A(松开),再单独按 D。按完会看到类似 [detached from 12345.mytask] 的提示,这才是成功分离。
常见错误现象:
- 按了 Ctrl+A 没反应 → 检查是否在
screen会话里(左下角通常显示[screen 0: bash]) - 按完 Ctrl+A+D 还卡在原界面 → 实际是误触了
Ctrl+A后没松开就按 D,screen只收到了Ctrl+A,D 被当成了普通输入 - 执行
screen -r mytask报错 “There is a screen on … (Attached)” → 说明别人(或你另一个终端)已连上该会话,改用screen -d -r mytask
tmux new-session -s 名字 和 tmux attach-session -t 名字 要配对用
tmux 的会话名是唯一标识,-s 是创建时指定,-t 是连接时指定,两个必须一致。不命名直接运行 tmux 会生成随机名(如 0),后续管理困难。
使用场景:
- 想后台静默启动一个训练任务:
tmux new-session -d -s train python train.py(-d表示不进入,直接后台) - 想恢复并交互:
tmux attach-session -t train - 多个同名会话冲突?先
tmux kill-session -t train清掉旧的,再新建
注意:tmux ls 输出里的会话名不含路径或 PID 前缀,和 screen -ls 不同,别拿 tmux ls 里显示的 train: 1 windows 去 screen -r train —— 那肯定失败。
nohup python xxx.py & 不能替代 screen/tmux
nohup 只屏蔽 SIGHUP,不提供会话管理能力。它跑起来后你无法重新 attach、看不到实时输出、不能交互、也不能分窗。一旦出错,只能翻 nohup.out 日志,没法 tail -f 实时盯。
参数差异:
-
nohup python run.py > log.txt 2>&1 &:输出全进文件,终端立刻返回,但你再也看不到 stdout 滚动 -
screen -S run python run.py:输出实时可见,随时Ctrl+A D脱离,screen -r run回来继续看 -
tmux new-session -s run 'python run.py':还能prefix %垂直分屏,一边跑程序一边tail -f log.txt
性能影响几乎为零,但体验差一个数量级。别为省一次安装(sudo apt install tmux)牺牲可维护性。
会话名别用空格或特殊字符,也别重复
screen -S "my task" 看似合理,实际会导致 screen -r "my task" 失败——空格会让 shell 拆成两个参数。同样,screen -S my-task 在部分老版本里也可能出问题。
推荐命名规则:
- 全小写
- 用下划线
_分隔单词(如data_preprocess_v2) - 避免数字开头(某些 shell 解析异常)
- 不同任务绝不重名,否则
screen -r data可能连错会话
真正容易被忽略的是:screen 和 tmux 的会话是进程级隔离的,但它们共享同一套系统资源(比如打开的文件描述符、环境变量)。如果你在会话里 source ~/.bashrc,退出再重连时不会自动重载——得手动再 source 一次,或者把关键变量写进 ~/.profile。


















