場景:長時間運行的任務佔據終端,你想繼續做別的事
編譯內核、大文件傳輸、資料庫遷移、訓練模型... 這些前台運行的進程會獨佔終端。Ctrl+Z + bg/fg + jobs 是 Shell 內建的作業控制三板斧,讓你靈活調度前後台任務,無需開新終端或 screen/tmux。
核心操作速查表
| 操作 | 按鍵/命令 | 效果 | 適用場景 |
| 掛起當前前台進程 | Ctrl+Z | 發送 SIGTSTP 信號,進程暫停並移入後台作業列表,狀態 Stopped | 臨時釋放終端、需插隊執行其他命令 |
| 查看後台作業 | jobs / jobs -l (顯示 PID) | 列出所有作業編號、狀態、命令 | 確認有哪些掛起/運行中的任務 |
| 後台繼續運行 | bg %n (n 為作業號,省略則操作最近一個 + 標記作業) | 發送 SIGCONT,進程在後台恢復運行,狀態 Running,終端可繼續輸入 | 編譯、下載、備份等無需交互的長任務 |
| 前台恢復運行 | fg %n | 將指定後台作業調回前台,佔據終端繼續運行 | 需要交互輸入、查看實時輸出、發送 Ctrl+C 終止 |
| 直接後台啟動 | command & | 啟動時直接放入後台,不佔據終端 | 明知無需交互的命令 |
| 終止後台作業 | kill %n | 發送 SIGTERM (默認) 給指定作業 | 不再需要的後台任務 |
實戰演示
案例 1:編譯內核中途需查閱文檔
$ make -j$(nproc) # 前台編譯,佔據終端
^Z # 按下 Ctrl+Z
[1]+ Stopped make -j$(nproc)
$ bg %1 # 讓編譯在後台繼續
[1]+ make -j$(nproc) &
$ vim /proc/cpuinfo # 終端自由,查閱文檔
$ fg %1 # 想看編譯進度,調回前台
make -j$(nproc)
...
$ Ctrl+C # 決定終止編譯
案例 2:多任務並發管理
進階細節與避坑指南
- 作業標記:
+ 當前作業 (最近操作);- 前一個作業。bg/fg 無參數時操作 +。
- SIGHUP 問題:關閉終端會向 Shell 發送 SIGHUP,Shell 默認傳遞給所有子進程 → 後台任務被殺。
解決:disown -h %n (標記不接收 SIGHUP) 或啟動時 nohup command & / setsid command。
- 輸出干擾:後台進程輸出會混雜在終端。
解決:重定向 command > log.txt 2>&1 & 或使用 screen/tmux 會話管理。
- 非交互命令才適合 bg:需要 stdin 的交互程序 (vim、python、ssh) 放後台會因讀取終端而再次停止 (SIGTTIN/SIGTTOU)。
- Zsh/Bash 差異:Zsh 默認
setopt AUTO_CONTINUE,fg 後自動發送 SIGCONT;Bash 需顯式 bg。
對比:作業控制 vs 終端多工器
| 特性 | Ctrl+Z/bg/fg/jobs | screen / tmux |
| 持久性 | 終端關閉即失效 (除非 disown/nohup) | 會話脫離終端獨立存在,隨時重連 |
| 多窗口/分屏 | 不支持 | 原生支持 |
| 學習成本 | 極低 (Shell 內建) | 中等 (前綴鍵、會話/窗口/面板概念) |
| 適用場景 | 臨時插隊、單機簡單任務 | 長期運行、遠程會話保持、複雜佈局 |
結語
Ctrl+Z 掛起、bg 後台、fg 前台、jobs 列表 — 這四個動作構成了 Shell 作業控制的完整閉環。掌握它們,你就擁有了在單一終端中並發管理多任務的核心能力,無需依賴圖形界面的多標籤或重度工具。下次編譯內核時,試試 Ctrl+Z → bg → 繼續碼代碼,體驗「一心二用」的爽快。