終端裡跑著編譯、備份、下載,想切回去改代碼卻發現被佔用?掌握 Shell 作業控制,讓你像指揮交響樂團一樣調度前後台任務。本文系統整理 &、Ctrl+Z、jobs、fg、bg、kill 核心指令與進階技巧,附狀態流轉圖與常見坑點。
| 指令/操作 | 功能 | 典型場景 |
|---|---|---|
cmd & | 啟動命令並**直接放入後台**運行 (不佔用終端) | 長時間編譯、下載、服務啟動 |
Ctrl+Z | **暫停**前台任務,返回 Shell 提示符 | 誤以前台啟動、需臨時切換其他操作 |
jobs -l | 列出當前 Shell 環境的所有作業 (含 PID、狀態、編號) | 查看有哪些後台/暫停任務 |
fg %n | 將作業 %n (jobs 編號) **調回前台**繼續運行 | 恢復互動式程式 (vim, top, python 交互) |
bg %n | 將**暫停**的作業 %n 在**後台繼續**運行 | Ctrl+Z 暫停後,改為後台不佔用終端 |
kill %n | 終止作業 %n (預設送 SIGTERM) | 正常結束後台任務 |
kill -9 %n | 強制終止 (SIGKILL,核心直接回收,進程無法捕捉) | 卡死、無法正常退出的任務 |
[啟動 cmd &] ──→ Running (背景)
[啟動 cmd] ──→ Running (前台) ──[Ctrl+Z]──→ Stopped ──[bg %n]──→ Running (背景)
│
└─[fg %n]──→ Running (前台)
Stopped / Running (背景) ──[kill %n]──→ Terminated ──(Shell 自動移除 jobs 列表)
$ ./tcpserv01 & # [1] 12345 (立即返回提示符,後台運行) $ ./tcpserv01 # 前台運行,佔用終端 ^Z # 用戶按 Ctrl+Z [1]+ Stopped ./tcpserv01 $ bg %1 # 讓作業 1 後台繼續 [1]+ ./tcpserv01 & $ jobs -l [1]+ 12345 Running ./tcpserv01 & $ fg %1 # 切回前台 (需互動時) ./tcpserv01 ^Z # 再次暫停 $ kill %1 # 結束它 [1]+ Terminated ./tcpserv01
jobs 顯示 [1] [2] 為**作業編號** (Shell 內部),kill %1 用百分號引用;ps/kill 12345 用 **PID** (核心層)。**切勿混淆**。jobs 輸出中 + 表示「當前作業」 (最近操作),- 表示「前一作業」。fg/bg 不加參數時操作「當前作業」。SIGHUP,導致後台任務意外退出。nohup cmd & 或 先 Ctrl+Z → bg → disown -h %1 (標記不接收 SIGHUP)。screen -S task 或 tmux new -s task**。kill 信號大全:kill -l 列出所有。常用 SIGTERM (15) 正常結束、SIGKILL (9) 強制殺死、SIGSTOP (19) 暫停 (不可捕捉)、SIGCONT (18) 繼續。
# 終止所有名為 tcpserv 的後台作業
for j in $(jobs -p | xargs -I{} ps -o pid= -p {} | xargs -I{} sh -c 'ps -o comm= -p {} | grep -q tcpserv && echo {}'); do
kill $j
done
作業控制是 Shell 互動式操作的核心技能。熟練掌握 &、Ctrl+Z、jobs、fg/bg、kill,配合 disown、nohup、screen/tmux,即能在單一終端輕鬆並行十數任務,從容應對開發、運維、除錯的多重場景切換。