问题
直接 python long-task.py → SSH 一断就死。你需要让任务脱离终端继续跑。
4 种递进方案
1. & —— 后台跑,但还属于当前终端
sleep 100 &
# [1] 12345
特点:
- shell 不阻塞,可以继续输命令
- 关掉终端进程也会死——除非加
disown(见下) - 输出仍打在当前终端
long-task &
disown # 把任务从 shell 的 jobs 列表里摘掉
# 现在关 shell 它不会死
2. nohup —— 不受挂断信号影响
nohup python long-task.py &
# 输出到 nohup.out
# 关 SSH 也不死
特点:
- 忽略 SIGHUP(挂断信号)
- stdout / stderr 默认重定向到
nohup.out - 简单可靠,临时长任务首选
加日志路径:
nohup python app.py > app.log 2>&1 &
3. screen / tmux —— 终端复用器(最强)
sudo apt install tmux
tmux # 启动一个 tmux 会话
# 在里面跑任何东西
# 按 Ctrl+B 然后 D → detach(离开但保留会话)
# SSH 断了也没事
tmux ls # 看有哪些会话
tmux attach # 回到上次会话
tmux attach -t 0 # 回到特定会话
tmux 基础快捷键(全部以 Ctrl+B 开头):
| 按键 | 作用 |
|---|---|
d |
detach |
c |
新窗口 |
, |
改窗口名 |
n / p |
下 / 上一窗口 |
0-9 |
跳到对应窗口 |
% |
垂直分屏 |
" |
水平分屏 |
o |
切换面板 |
x |
关闭面板 |
服务器上必装 tmux——长任务、调试、多窗口工作流都需要。
4. systemd 服务 —— 真正的"后台服务"
跑生产服务(Web 应用、数据库等)就别用 nohup——做成 systemd unit 才是正解。详见下一篇 21-systemctl.md。
jobs / fg / bg
sleep 100 & # 启动后台任务
sleep 200 &
jobs # 看后台任务
# [1]- Running sleep 100 &
# [2]+ Running sleep 200 &
fg # 把最近的任务拉回前台
fg %1 # 拉特定任务回前台
Ctrl+Z # 暂停当前前台任务
bg # 把暂停的任务放后台跑
实战:
# 正在编辑文件,临时跑个命令
vim file.txt
# 按 Ctrl+Z → vim 暂停
ls
grep foo bar
fg # 回到 vim
决策矩阵
| 任务类型 | 用 |
|---|---|
| 跑 10 秒的脚本想后台 | & |
| 跑几小时的脚本 SSH 可能断 | nohup |
| 想随时回来看 / 多窗口 | tmux |
| 长期生产服务 | systemd(下篇) |
下一篇:systemctl 管理服务。