工作管理(job control) 是用在bash環(huán)境下的
也就是說(shuō),當(dāng)我們登入系統(tǒng)取得bash shell之后,在單一終端機(jī)接口下同時(shí)進(jìn)行多個(gè)工作的行為管理。
舉例:我們?cè)诘侨隻ash后,想要一邊復(fù)制文件、一邊進(jìn)行資料搜尋、一邊進(jìn)行編譯、還可以一邊進(jìn)行vim程序撰寫(xiě)。當(dāng)然我們可以重復(fù)登入那六個(gè)文字接口的終端機(jī)環(huán)境中,但是我們其實(shí)是能在一個(gè)bash內(nèi)達(dá)成的!這就是job control了
防止意外:
(/etc/security/limits.conf里可以設(shè)定使用者同時(shí)可以登入的聯(lián)機(jī)數(shù),如果我們被設(shè)定僅能以一個(gè)聯(lián)機(jī)來(lái)工作,就不得不使用job control的模式。)
1. job control的注意事項(xiàng)
注意: 進(jìn)行工作管理的行為中,其實(shí)每個(gè)工作都是目前bash的子進(jìn)程,亦即彼此之間是有相關(guān)性的。我們無(wú)法以job control的方式由tty1的環(huán)境去管理tty2的bash(這個(gè)概念先建立起來(lái))。
要進(jìn)行bash的job control必須要注意到的限制是
- 這些工作所觸發(fā)的進(jìn)程必須來(lái)自于你shell的子進(jìn)程(只管理自己的bash)
- 前景: 你可以控制與下達(dá)指令的這個(gè)環(huán)境稱(chēng)為前景的工作(foreground)
- 背景:可以自行運(yùn)作的工作,你無(wú)法使用contrl+c終止他,可使用bg/fg呼叫該工作
- 背景中“執(zhí)行”的進(jìn)程不能等待 terminal/shell 的輸入(input)
2. job control的管理
知識(shí)背景
bash 只能夠管理自己的工作而不能管理其他bash的工作,所以即使你是root也不能夠?qū)e人的bash底下的job給他拿過(guò)來(lái)執(zhí)行。此外,又分前景與背景,然后背景里面的工作狀態(tài)又可以分為 暫停 stop 與 運(yùn)作中 running.
2.1 直接將指令丟到背景中 執(zhí)行的 &
假如我們要將 /etc/整個(gè)目錄備份成為 /tmp/etc.tar.gz,便可以直接在命令行中輸入: tar -zpcf /tmp/etc.tar.gz /etc &(工作模式:tar -zpcf 壓縮文件目錄及名稱(chēng) 待壓縮目錄的路徑及名稱(chēng))

其中
[1]為工作號(hào)碼(job number)與bash的控制有關(guān)14432是該指令所觸發(fā)的PID然后我們可以忽略它得繼續(xù)操作bash
任務(wù)完成后的提示:

圖片表示 job [1]已經(jīng)完成,而接在其后的一串指令列即 工作指令。
插播
zip的使用(和tar類(lèi)似)
- 壓縮用zip
zip -r /tmp/etc.zip /etc(zip -r 壓縮文件路徑 待壓縮目錄)
翻譯成人話:將/etc目錄壓縮成 etc.zip,放置在/tmp目錄下(-r 表示遞歸壓縮子目錄下所有文件)- 解壓縮用unzip
unzip -d /tmp etc.zipzip -d 解壓縮到的路徑 壓縮文件名稱(chēng)
翻譯成人話:將etc.zip解壓縮到/tmp目錄下(-d 表示解壓縮到的目錄,默認(rèn)當(dāng)前路徑下)
不過(guò),需要注意的是
在背景當(dāng)中執(zhí)行的指令,如果有 stdout 及 stderr 時(shí),他的數(shù)據(jù)依舊是輸出到屏幕上面,而由于是背景工作,通過(guò)[ctrl]+c也無(wú)法停止程序。因此在進(jìn)行此類(lèi)工作時(shí),最佳的狀況就是利用數(shù)據(jù)流重導(dǎo)向,將輸出數(shù)據(jù)傳送到某個(gè)文件中。

例如??,如此一來(lái),輸出信息都傳送到 /tmp/log.txt了。
2.2 將“目前”的工作丟到背景中“暫?!保篬ctrl]-z
在vim的一般模式下,如果我們需要到bash環(huán)境下進(jìn)行搜尋,此時(shí)不需要結(jié)束vim,直接 [ctrl] -z即可將他丟到背景中等待。
參考如下鳥(niǎo)哥的解釋?zhuān)?br>

不同于 前面提到的
& 將程序丟到背景里,在預(yù)設(shè)的情況下,使用[ctrl-z]丟到背景當(dāng)中的工作都是“暫?!钡臓顟B(tài)。
2.3 觀察目前的背景工作狀態(tài):jobs
如果我們想知道有什么工作在背景中,就用jobs這個(gè)指令。
一般來(lái)說(shuō),我們直接在命令行中輸入jobs就可以了,不過(guò)它還有一些參數(shù),可以根據(jù)需求添加
工作模式:jobs [-lrs]
選項(xiàng)與參數(shù):
-
-l:除了列出 job number 與指令串之外,同時(shí)列出PID的號(hào)碼 -
-r:僅列出正在背景 run 的工作 -
-s:僅列出正在背景當(dāng)中暫停(stop) 的工作
jobs -l
解釋一下 job number 后面的 “+” “-”符號(hào):
+代表最近被放到背景的工作號(hào)碼
- 代表最近最后第二個(gè)被放到背景中的工作號(hào)碼
超過(guò)最后第三個(gè)以后的工作,就不會(huì)有+/-符號(hào)存在了
這里的意義在于:就像??圖中的情況,如果我們直接輸入fg時(shí)(fg是 “將背景工作拿到前景來(lái)處理” 的命令) ,那個(gè)伴隨"+"的job[2]會(huì)被預(yù)設(shè)拿到前景中來(lái)處理
2.4 將背景工作拿到前景來(lái)處理 : fg(foreground)
- 工作模式:
fg %jobnumber - 選項(xiàng)與參數(shù)
%jobnumberjobnumber為工作號(hào)碼(數(shù)字) ## 注意,那個(gè)%是可有可無(wú)的
2.5 讓工作在背景下的狀態(tài)變成運(yùn)作中:bg
鳥(niǎo)哥在下面這個(gè)圖中講得很詳細(xì),工作模式和fg相同

2.6 管理背景當(dāng)中的工作 kill
如果我們想要將工作移除,可以使用kill這個(gè)命令,當(dāng)然它還有一些參數(shù)來(lái)作為輔助
工作模式:kill -signal %jobnumber
常見(jiàn)參數(shù)介紹
-l注意這里是L的小寫(xiě),列出目前kill能夠使用的參數(shù)有哪些
-1 重新讀取一次參數(shù)的配置文件
-2 代表與由鍵盤(pán)輸入 [ctrl] -c 同樣的動(dòng)作
-9 立刻強(qiáng)制刪除一個(gè)工作
-15 以正常的進(jìn)程方式終止一項(xiàng)工作。與-9不一樣
想要了解signal的更多信息:man 7 signal去查詢相關(guān)資料
這里解釋一下kill -9 和 kill -15 ,當(dāng)然推薦大家都使用 kill -15,如果是迫不得已再使用kill -9。因?yàn)橛械倪M(jìn)程在運(yùn)行過(guò)程中會(huì)產(chǎn)生一些文本,kill -15在kill進(jìn)程時(shí)會(huì)將與進(jìn)程相關(guān)的一切(包括中間生成的文本)一并刪除。而kill -9會(huì)強(qiáng)制得將工作移除掉,而一些中間產(chǎn)物會(huì)繼續(xù)存在文件系統(tǒng)里。
注意:kill 后面接的數(shù)字默認(rèn)是PID,如果想要管理bash的工作控制,必須使用
kill -signal %jobnumber的形式(不同于fg)
3. 脫機(jī)管理問(wèn)題
很多小伙伴剛接觸linux時(shí),會(huì)把 &放到背景中運(yùn)行的模式當(dāng)作放到系統(tǒng)的背景去,這么理解就錯(cuò)了。
我們之前在“工作管理”中提到的“背景”指的是bash的背景(也就是說(shuō),指的是在終端機(jī)模式下可以避免ctrl -c中斷的一個(gè)情景),而不是放到系統(tǒng)的背景去。如果不好理解,舉個(gè)例子:如果你是以遠(yuǎn)程聯(lián)機(jī)的方式連接到你的Linux主機(jī)(terminal 或 putty),并且以&的方式放到背景去,如果工作尚未結(jié)束你就exit脫機(jī)了,你放在bash背景中的未完成的工作就會(huì)被中斷的。
那該怎么辦呢?如果我的工作需要進(jìn)行一大段時(shí)間(>24h),總不能一直守著自己的終端機(jī),開(kāi)著遠(yuǎn)程聯(lián)機(jī)軟件肉眼看著吧。對(duì)于這種情況,我們可以將工作放置在系統(tǒng)背景,這樣就與終端機(jī)無(wú)關(guān)了。
因此,這種情況我們可以使用at 和 nohup
3.1 nohop
nohup可以讓你在脫機(jī)或注銷(xiāo)系統(tǒng)后,還能夠讓工作繼續(xù)進(jìn)行,它的工作模式
nonhup [指令與參數(shù)] 命令 & 這樣就可以在系統(tǒng)背景中運(yùn)行
3.2 at
at這個(gè)指令通常是用在僅執(zhí)行一次的工作排程里(將某些工作排進(jìn)進(jìn)程表中,在指定的時(shí)間執(zhí)行)。當(dāng)然,由于涉及系統(tǒng)安全問(wèn)題,不是每個(gè)人都可以使用at的。查看/etc/at.allow(可以使用的名單) 和 /etc/at.deny(不可以使用的名單)兩個(gè)文件,如果兩個(gè)文件都不存在,那么只有root可以使用at這個(gè)命令。
- at 的運(yùn)作方式
使用at這個(gè)指令來(lái)產(chǎn)生所要運(yùn)作的工作,實(shí)質(zhì)上,是將待運(yùn)行的工作以文本的方式寫(xiě)入/var/sool/at/目錄內(nèi)。通過(guò)這種方式,便能通過(guò)atd這個(gè)服務(wù),進(jìn)行工作的取用與執(zhí)行。


- at 的工作管理
atq查詢目前主機(jī)上有多少at工作排程
atrm (jobnumber)刪除錯(cuò)誤的命令
拿鳥(niǎo)哥的圖來(lái)理解

