jobs 與 bg/fg:工作控制完全指南
在 Linux 終端機中,我們經常需要同時執行多個任務。然而,當一個指令正在佔用終端機(例如進行長檔案壓縮、伺服器偵錯或大型編譯)時,我們該如何切換到其他工作?或者,當我們不小心將一個重要程序放到了背景執行,該如何將其喚回前景?這就是 Linux 工作控制(Job Control)機制發揮作用的地方。本文将深入解析 jobs、bg 和 fg 這三個核心指令,幫助你靈活掌控終端機的多工處理。
什麼是工作控制?
在 Linux 中,「工作」(Job)指的是由 shell 啟動並追蹤的程式進程。當你在終端機輸入指令並按下 Enter 時,該指令預設會在「前景」(Foreground)執行,這意味著你的終端機會被該程式鎖定,直到它結束為止。
透過工作控制,你可以將程式移至「背景」(Background)執行,讓終端機恢復互動狀態,同時監控或切換不同工作的狀態。
核心指令解析
1. jobs:查看所有工作狀態
jobs 指令用於列出目前 shell 工作階段中所有的工作。它不會顯示系統中所有的進程,僅限於當前 shell 啟動的工作。
常用選項:
-l:顯示工作的 Process ID (PID)。-n:僅顯示最近狀態有改變的工作。
實際範例:
假設我們在終端機中執行了幾個不同的指令:
$ sleep 100 &
[1] 12345
$ sleep 200 &
[2] 12346
$ jobs -l
[1] 12345 suspended sleep 100
[2]- 12346 running sleep 200
[1]和[2]是工作編號(Job ID)。12345和12346是對應的 PID。suspended表示該工作已暫停(通常由Ctrl+Z觸發)。running表示該工作正在執行中。
2. bg:將工作移至背景繼續執行
當一個工作因按下 Ctrl+Z 而暫停時,它處於「已暫停」狀態,並不會消耗 CPU 資源。若要讓它在背景中繼續運行,需使用 bg (background) 指令。
語法:
bg [工作編號]
若省略工作編號,bg 會將最近暫停的工作移至背景。
實際範例:
接續上面的範例,假設我們用 Ctrl+Z 暫停了一個 vim 編輯器:
$ vim file.txt
^Z
[3]+ Stopped vim file.txt
此時輸入 bg:
$ bg %3
[3]+ vim file.txt &
現在,vim 會在背景繼續執行,而你的終端機恢復了提示符號,可以輸入其他指令。注意,背景程式仍會嘗試寫入終端機,若輸出過多可能會干擾當前操作,建議重導向輸出。
3. fg:將工作拉回前景
當你需要與某個背景中的程式互動(例如關閉 vim 或查看 top 的即時輸出),就需要使用 fg (foreground) 指令。
語法:
fg [工作編號]
實際範例:
將工作編號 3 的 vim 拉回前景:
$ fg %3
此時,終端機的控制權會交還給 vim。完成後,你可以按 Ctrl+D 或輸入 :q 離開,該工作結束,終端機恢復正常。
進階技巧與注意事項
-
使用
%符號指定工作: 除了工作編號,也可以透過程式名稱或前綴來指定工作。例如fg %vim會將名為 vim 的工作拉到前景。 -
背景程式的輸出: 背景程式若嘗試寫入終端機,可能會收到
Hangup信號而終止。建議在啟動背景程式時使用nohup或重導向輸出:$ sleep 100 > /dev/null 2>&1 & -
終端機關閉後的影響: 若關閉終端機視窗,預設會發送
SIGHUP信號給所有工作,導致背景程式終止。若需長期執行,請使用screen、tmux或nohup。
常見問題
Q1:為什麼 jobs 看不到我剛啟動的程式?
A:jobs 僅列出當前 shell 工作階段的工作。如果你在其他終端機視窗或 SSH 連線中啟動程式,當前 shell 是無法看見的。此外,若程式是由其他指令(如 cron 或服務管理器 systemd)啟動,也不屬於當前 shell 的工作。
Q2:使用 bg 後程式還是沒跑,怎麼辦?
A:檢查該程式是否依賴終端機輸入(Interactive)。某些程式(如 vim、less)在背景中可能無法正常運作,因為它們預期與終端機互動。對於這類程式,建議直接在前景執行,或使用 tmux 等終端模擬器。
小結
掌握 jobs、bg 和 fg 是提升 Linux 操作效率的關鍵。透過靈活運用工作控制,你可以在單一的終端機視窗中無縫切換多個任務,無需頻繁開啟多個視窗。記住,工作控制僅限於當前 shell 工作階段,對於需要長期運行的服務,請考慮使用更強大的進程管理工具。