1. 程式人生 > >Linux - 工作管理(job control),jobs,fg,bg,kill

Linux - 工作管理(job control),jobs,fg,bg,kill

new 沒有 yellow 字節 back 至少 roc root 都是

什麽是工作管理?

『進行工作管理的行為中, 事實上每一個工作都是眼下 bash 的子程序,亦即彼此之間是有相關性的。 我們無法以 job control 的方式由 tty1 的環境去管理 tty2 的 bash !』 這個概念請你得先創建起來,興許的範例介紹之後。你就會清楚的了解羅。

由於如果我們僅僅有一個終端介面,因此在能夠出現提示字節讓你操作的環境就稱為前景 (foreground)。至於其它工作就能夠讓你放入背景 (background) 去暫停或執行。

要註意的是,放入背景的工作想要執行時, 他必須不能夠與使用者互動。舉例來說, vim 絕對不可能在背景裏面執行 (running) 的!由於你沒有輸入數據他就不會跑啊。 並且放入背景的工作是不能夠使用 [ctrl]+c 來終止的』!

總之,要進行 bash 的 job control 必需要註意到的限制是:

這些工作所觸發的程序必須來自於你 shell 的子程序(僅僅管理自己的 bash);
前景:你能夠控制與下達命令的這個環境稱為前景的工作 (foreground)。
背景:能夠自行執行的工作。你無法使用 [ctrl]+c 終止他,可使用 bg/fg 呼叫該工作。
背景中『執行』的程序不能等待 terminal/shell 的輸入(input)


直接將命令丟到背景中『執行』的 &

[[email protected] ~]# tar -zpcf /tmp/etc.tar.gz /etc &
[1] 8400  <== [job number] PID 
[[email protected] ~]# tar: Removing leading `/‘ from member names 
# 在中括號內的號碼為工作號碼 (job number),該號碼與 bash 的控制有關。

# 興許的 8400 則是這個工作在系統中的 PID。至於興許出現的數據是 tar 執行的數據流, # 由於我們沒有加上數據流重導向,所以會影響畫面!只是不會影響前景的操作喔!


將『眼下』的工作丟到背景中『暫停』:[ctrl]-z

[[email protected] ~]# vi ~/.bashrc
# 在 vi 的一般模式下。按下 [ctrl]-z 這兩個按鍵
[1]+  Stopped                 vim ~/.bashrc
[[email protected] ~]#   <==順利取得了前景的操控權!

[[email protected] ~]# find / -print ....(輸出省略).... # 此時螢幕會很的忙碌!

由於螢幕上會顯示全部的檔名。請按下 [ctrl]-z 暫停 [2]+ Stopped find / -print


在 vi 的一般模式下。按下 [ctrl] 及 z 這兩個按鍵。螢幕上會出現 [1] 。表示這是第一個工作。 而那個 + 代表近期一個被丟進背景的工作。且眼下在背景下默認會被取用的那個工作 (與 fg 這個命令有關 )!而那個 Stopped 則代表眼下這個工作的狀態。

在默認的情況下,使用 [ctrl]-z 丟到背景其中的工作都是『暫停』的狀態喔!

觀察眼下的背景工作狀態: jobs

[[email protected] ~]# jobs [-lrs]
選項與參數:
-l  :除了列出 job number 與命令串之外,同一時候列出 PID 的號碼。
-r  :僅列出正在背景 run 的工作。
-s  :僅列出正在背景其中暫停 (stop) 的工作。

範例一:觀察眼下的 bash 其中。全部的工作。與相應的 PID [[email protected] ~]# jobs -l [1]- 10314 Stopped vim ~/.bashrc [2]+ 10833 Stopped find / -print


假設想要知道眼下有多少的工作在背景其中。就用 jobs 這個命令吧!

一般來說。直接下達 jobs 就可以! 只是,假設你還想要知道該 job number 的 PID 號碼,能夠加上 -l 這個參數啦! 在輸出的資訊其中。比如上表,細致看到那個 + - 號喔!

那個 + 代表默認的取用工作。 所以說:『眼下我有兩個工作在背景其中。兩個工作都是暫停的。 而假設我僅輸入 fg 時,那麽那個 [2] 會被拿到前景其中來處理』!

事實上 + 代表近期被放到背景的工作號碼, - 代表近期最後第二個被放置到背景中的工作號碼。 而超過最後第三個以後的工作。就不會有 +/- 符號存在了!

將背景工作拿到前景來處理:fg

[[email protected] ~]# fg %jobnumber
選項與參數:
%jobnumber :jobnumber 為工作號碼(數字)。註意。那個 % 是可有可無的。

範例一:先以 jobs 觀察工作,再將工作取出:
[[email protected] ~]# jobs
[1]- 10314 Stopped                 vim ~/.bashrc
[2]+ 10833 Stopped                 find / -print
[[email protected] ~]# fg      <==默認取出那個 + 的工作。亦即 [2]。馬上按下[ctrl]-z
[[email protected] ~]# fg %1   <==直接規定取出的那個工作號碼!再按下[ctrl]-z
[[email protected] ~]# jobs
[1]+  Stopped                 vim ~/.bashrc
[2]-  Stopped                 find / -print

經過 fg 命令就行將背景工作拿到前景來處理羅!只是比較有趣的是最後一個顯示的結果,我們會發現 + 出如今第一個工作後! 怎麽會這樣啊?這是由於你剛剛利用 fg %1 將第一號工作捉到前景後又放回背景,此時最後一個被放入背景的將變成 vi 那個命令動作。 所以當然 [1] 後面就會出現 + 了!了解乎。另外。假設輸入『 fg - 』 則代表將 - 號的那個工作號碼拿出來。上面就是 [2]- 那個工作號碼啦!


讓工作在背景下的狀態變成執行中: bg

範例一:一執行 find / -perm +7000 > /tmp/text.txt 後,立馬丟到背景去暫停!
[[email protected] ~]# find / -perm +7000 > /tmp/text.txt
# 此時。請立馬按下 [ctrl]-z 暫停!

[3]+ Stopped find / -perm +7000 > /tmp/text.txt 範例二:讓該工作在背景下進行,而且觀察他!。 [[email protected] ~]# jobs ; bg %3 ; jobs [1]- Stopped vim ~/.bashrc [2] Stopped find / -print [3]+ Stopped find / -perm +7000 > /tmp/text.txt [3]+ find / -perm +7000 > /tmp/text.txt & <==用 bg%3 的情況!

[1]+ Stopped vim ~/.bashrc [2] Stopped find / -print [3]- Running find / -perm +7000 > /tmp/text.txt &


看到哪裏有差異嗎?呼呼。沒錯!就是那個狀態列~以經由 Stopping 變成了 Running 羅!

看到差異點,嘿嘿!命令列最後方多了一個 & 的符號羅。 代表該工作被啟動在背景其中了啦。 ^_^

管理背景其中的工作: kill

[[email protected] ~]# kill -signal %jobnumber
[[email protected] ~]# kill -l
選項與參數:
-l  :這個是 L 的小寫,列出眼下 kill 可以使用的訊號 (signal) 有哪些?
signal :代表給予後面接的那個工作什麽樣的指示羅!用 man 7 signal 可知:
  -1 :又一次讀取一次參數的配置檔 (類似 reload)。
  -2 :代表與由鍵盤輸入 [ctrl]-c 相同的動作。
  -9 :立馬強制刪除一個工作;
  -15:以正常的程序方式終止一項工作。與 -9 是不一樣的。

範例一:找出眼下的 bash 環境下的背景工作,並將該工作『強制刪除』。
[[email protected] ~]# jobs
[1]+  Stopped                 vim ~/.bashrc
[2]   Stopped                 find / -print
[[email protected] ~]# kill -9 %2; jobs
[1]+  Stopped                 vim ~/.bashrc
[2]   Killed                  find / -print
# 再過幾秒你再下達 jobs 一次,就會發現 2 號工作不見了。由於被移除了!

範例:找出眼下的 bash 環境下的背景工作,並將該工作『正常終止』掉。 [[email protected] ~]# jobs [1]+ Stopped vim ~/.bashrc [[email protected] ~]# kill -SIGTERM %1 # -SIGTERM 與 -15 是一樣的。您可以使用 kill -l 來查閱!


特別留意一下。 -9 這個 signal 一般是用在『強制刪除一個不正常的工作』時所使用的, -15 則是以正常步驟結束一項工作(15也是默認值),兩者之間並不同樣呦!舉上面的樣例來說, 我用 vi 的時候。不是會產生一個 .filename.swp 的文件嗎? 那麽。當使用 -15 這個 signal 時, vi 會嘗試以正常的步驟來結束掉該 vi 的工作, 所以 .filename.swp 會主動的被移除。但若是使用 -9 這個 signal 時。由於該 vi 工作會被強制移除掉,因此, .filename.swp 就會繼續存在文件系統其中。這樣您應該能夠略微分辨一下了吧?

事實上, kill 的妙用是非常無窮的啦!他搭配 signal 所詳列的資訊 (用 man 7 signal 去查閱相關數據) 能夠讓您有效的管理工作與程序 (Process),此外。那個 killall 也是相同的使用方法。 至於經常使用的 signal 您至少須要了解 1, 9, 15 這三個 signal 的意義才好。 此外, signal 除了以數值來表示之外,也能夠使用訊號名稱喔! 舉例來說,上面的範例二就是一個樣例啦!

至於 signal number 與名稱的相應, 呵呵,使用 kill -l 就知道啦(L的小寫)!

另外, kill 後面接的數字默認會是 PID 。假設想要管理 bash 的工作控制。就得要加上 %數字 了, 這點也得特別留意才行喔!

Linux - 工作管理(job control),jobs,fg,bg,kill