断开后让进程继续运行
默认情况下,关闭 SSH 会话会杀掉你在里面启动的东西。要让命令在你断开后继续运行,把它启动在一个终端复用器里——tmux(或 screen),这是最好、最灵活的选项。一次性的话 nohup … & 也行。在移动端这一点加倍重要:切网络或 App 退后台时连接会断,分离与否就是"丢任务"和"不丢"的区别。
为什么会死
你的 SSH 会话结束时,shell 给它的子进程发 SIGHUP("挂断"),多数就退出了。修法是把进程跑在一个能挺过会话的地方——一个分离的 tmux/screen 会话,或一个被明确告知忽略挂断的进程。
最好的办法:tmux
tmux 让一个 shell 在服务器上独立于你的连接存活。启动它、跑你的活、分离、断开——活继续。稍后你正好从离开处重新挂上。
tmux # 启动一个会话
# … 跑你的长命令 …
# 分离:按 Ctrl-b 再按 d
# 现在可以安全断开
# 稍后重连后:
tmux attach # 正好回到你离开处 有多个会话:tmux ls 列出,tmux attach -t 0 选一个。screen 是更老的等价物(screen,分离 Ctrl-a d,重挂 screen -r)——装了哪个用哪个。
快速的办法:nohup
对一条你只想启动后离开的命令:
nohup ./long_job.sh > job.log 2>&1 & nohup 让进程忽略挂断,& 放后台,重定向把输出存到文件(因为没有终端可打印)。稍后用 tail -f job.log 看进度。已经启动了才想起来?disown -h %1 把最近的后台任务从 shell 分离,让它存活。
该用哪个?
| 你想… | 用 |
|---|---|
| 回来还要和会话交互 | tmux / screen |
| 启动后不管,稍后看日志 | nohup … & |
| 保住一个已启动的任务 | disown |
为什么这在移动端必不可少
在手机上,连接天生脆弱:你走出 Wi-Fi 范围、切到蜂窝、或长等待时 OS 挂起 App——普通 SSH 会话(和它跑的命令)就死了,常带一个 broken pipe。跑在 tmux 里就让掉线成了无关紧要的小事:活在服务器上继续跑,你重连后 tmux attach 重新挂上。再配一个稳定地址(Tailscale),重连就是一点。这是让手机管理可靠的习惯。
常见问题
怎么在关闭 SSH 后让进程继续运行?
把它启动在 tmux(或 screen)里,Ctrl-b 再 d 分离,然后断开——进程继续跑。稍后 tmux attach 重新挂上。一次性的用 nohup command &。
tmux 和 nohup 有什么区别?
tmux 让一个可重新挂上的交互会话存活;nohup 只是启动一条忽略挂断、后台运行的命令。想回到会话就用 tmux。
已经启动了一条命令,能保住吗?
能:disown -h %1 把一个运行中的后台任务分离、让它挺过会话。(它得已经在后台——用 Ctrl-z 再 bg,或以 & 启动。)
为什么移动端 SSH 一断我的任务就死?
断开的会话给进程发 SIGHUP。跑在 tmux 里让它们独立于连接——在掉线常见的移动端必不可少。
快速事实
- 为何会死:关闭 SSH 给子进程发 SIGHUP
- 最好:跑在
tmux里——分离(Ctrl-b d)、断开、稍后tmux attach - 快速:
nohup command > log 2>&1 &启动后不管 - 已在跑:
disown -h %1保住它 - 移动端:tmux 把掉线变成无关紧要的小事
Free on iOS and Android. 5 AI requests/day on the free tier, plus unlimited SSH/SFTP and built-in Tailscale.