jobs 與 bg/fg:工作控制完全指南 文章首圖

jobs 與 bg/fg:工作控制完全指南

jobs 與 bg/fg:工作控制完全指南

在 Linux 終端機中,我們經常需要同時執行多個任務。然而,當一個指令正在佔用終端機(例如進行長檔案壓縮、伺服器偵錯或大型編譯)時,我們該如何切換到其他工作?或者,當我們不小心將一個重要程序放到了背景執行,該如何將其喚回前景?這就是 Linux 工作控制(Job Control)機制發揮作用的地方。本文将深入解析 jobsbgfg 這三個核心指令,幫助你靈活掌控終端機的多工處理。

什麼是工作控制?

在 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)。
  • 1234512346 是對應的 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 離開,該工作結束,終端機恢復正常。

進階技巧與注意事項

  1. 使用 % 符號指定工作: 除了工作編號,也可以透過程式名稱或前綴來指定工作。例如 fg %vim 會將名為 vim 的工作拉到前景。

  2. 背景程式的輸出: 背景程式若嘗試寫入終端機,可能會收到 Hangup 信號而終止。建議在啟動背景程式時使用 nohup 或重導向輸出:

    $ sleep 100 > /dev/null 2>&1 &
  3. 終端機關閉後的影響: 若關閉終端機視窗,預設會發送 SIGHUP 信號給所有工作,導致背景程式終止。若需長期執行,請使用 screentmuxnohup

常見問題

Q1:為什麼 jobs 看不到我剛啟動的程式? A:jobs 僅列出當前 shell 工作階段的工作。如果你在其他終端機視窗或 SSH 連線中啟動程式,當前 shell 是無法看見的。此外,若程式是由其他指令(如 cron 或服務管理器 systemd)啟動,也不屬於當前 shell 的工作。

Q2:使用 bg 後程式還是沒跑,怎麼辦? A:檢查該程式是否依賴終端機輸入(Interactive)。某些程式(如 vimless)在背景中可能無法正常運作,因為它們預期與終端機互動。對於這類程式,建議直接在前景執行,或使用 tmux 等終端模擬器。

小結

掌握 jobsbgfg 是提升 Linux 操作效率的關鍵。透過靈活運用工作控制,你可以在單一的終端機視窗中無縫切換多個任務,無需頻繁開啟多個視窗。記住,工作控制僅限於當前 shell 工作階段,對於需要長期運行的服務,請考慮使用更強大的進程管理工具。