斷線後讓程序繼續執行
預設情況下,關閉 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.