问题

直接 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 管理服务。