Linux - 工作管理(job control),jobs,fg,bg,kill
什麽是工作管理?
『進行工作管理的行為中, 事實上每一個工作都是眼下 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 的控制有關。 |
將『眼下』的工作丟到背景中『暫停』:[ctrl]-z
[[email protected] ~]# vi ~/.bashrc # 在 vi 的一般模式下。按下 [ctrl]-z 這兩個按鍵 [1]+ Stopped vim ~/.bashrc [[email protected] ~]# <==順利取得了前景的操控權! [[email protected] ~]# find / -print ....(輸出省略).... # 此時螢幕會很的忙碌! |
在默認的情況下,使用 [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 就可以! 只是,假設你還想要知道該 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 |
讓工作在背景下的狀態變成執行中: 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 & |
看到差異點,嘿嘿!命令列最後方多了一個 & 的符號羅。 代表該工作被啟動在背景其中了啦。 ^_^
管理背景其中的工作: 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 來查閱! |
事實上, 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