工作管理(job control) 是用在bash環(huán)境下的
也就是說,當(dāng)我們登入系統(tǒng)取得bash shell之后抽米,在單一終端機(jī)接口下同時進(jìn)行多個工作的行為管理。
舉例:我們在登入bash后滔蝉,想要一邊復(fù)制文件抠璃、一邊進(jìn)行資料搜尋、一邊進(jìn)行編譯礁遵、還可以一邊進(jìn)行vim程序撰寫轻绞。當(dāng)然我們可以重復(fù)登入那六個文字接口的終端機(jī)環(huán)境中,但是我們其實(shí)是能在一個bash內(nèi)達(dá)成的榛丢!這就是job control了
防止意外:
(/etc/security/limits.conf里可以設(shè)定使用者同時可以登入的聯(lián)機(jī)數(shù)铲球,如果我們被設(shè)定僅能以一個聯(lián)機(jī)來工作,就不得不使用job control的模式晰赞。)
1. job control的注意事項
注意: 進(jìn)行工作管理的行為中,其實(shí)每個工作都是目前bash的子進(jìn)程选侨,亦即彼此之間是有相關(guān)性的掖鱼。我們無法以job control的方式由tty1的環(huán)境去管理tty2的bash(這個概念先建立起來)。
要進(jìn)行bash的job control必須要注意到的限制是
- 這些工作所觸發(fā)的進(jìn)程必須來自于你shell的子進(jìn)程(只管理自己的bash)
- 前景: 你可以控制與下達(dá)指令的這個環(huán)境稱為前景的工作(foreground)
- 背景:可以自行運(yùn)作的工作援制,你無法使用contrl+c終止他戏挡,可使用bg/fg呼叫該工作
- 背景中“執(zhí)行”的進(jìn)程不能等待 terminal/shell 的輸入(input)
2. job control的管理
知識背景
bash 只能夠管理自己的工作而不能管理其他bash的工作,所以即使你是root也不能夠?qū)e人的bash底下的job給他拿過來執(zhí)行晨仑。此外褐墅,又分前景與背景,然后背景里面的工作狀態(tài)又可以分為 暫停 stop 與 運(yùn)作中 running.
2.1 直接將指令丟到背景中 執(zhí)行的 &
假如我們要將 /etc/整個目錄備份成為 /tmp/etc.tar.gz洪己,便可以直接在命令行中輸入: tar -zpcf /tmp/etc.tar.gz /etc &
(工作模式:tar -zpcf 壓縮文件目錄及名稱 待壓縮目錄的路徑及名稱
)
其中
[1]
為工作號碼(job number)與bash的控制有關(guān)14432
是該指令所觸發(fā)的PID然后我們可以忽略它得繼續(xù)操作bash
任務(wù)完成后的提示:
圖片表示 job [1]已經(jīng)完成妥凳,而接在其后的一串指令列即 工作指令。
插播
zip
的使用(和tar
類似)
- 壓縮用zip
zip -r /tmp/etc.zip /etc
(zip -r 壓縮文件路徑 待壓縮目錄)
翻譯成人話:將/etc目錄壓縮成 etc.zip答捕,放置在/tmp目錄下(-r 表示遞歸壓縮子目錄下所有文件)- 解壓縮用unzip
unzip -d /tmp etc.zip
zip -d 解壓縮到的路徑 壓縮文件名稱
翻譯成人話:將etc.zip解壓縮到/tmp目錄下(-d 表示解壓縮到的目錄逝钥,默認(rèn)當(dāng)前路徑下)
不過,需要注意的是
在背景當(dāng)中執(zhí)行的指令拱镐,如果有 stdout 及 stderr 時艘款,他的數(shù)據(jù)依舊是輸出到屏幕上面持际,而由于是背景工作,通過[ctrl]+c
也無法停止程序哗咆。因此在進(jìn)行此類工作時蜘欲,最佳的狀況就是利用數(shù)據(jù)流重導(dǎo)向,將輸出數(shù)據(jù)傳送到某個文件中晌柬。
例如??芒填,如此一來,輸出信息都傳送到 /tmp/log.txt了空繁。
2.2 將“目前”的工作丟到背景中“暫偷钏ィ”:[ctrl]-z
在vim的一般模式下,如果我們需要到bash環(huán)境下進(jìn)行搜尋盛泡,此時不需要結(jié)束vim闷祥,直接 [ctrl] -z即可將他丟到背景中等待。
參考如下鳥哥的解釋:
不同于 前面提到的
&
將程序丟到背景里傲诵,在預(yù)設(shè)的情況下凯砍,使用[ctrl-z]丟到背景當(dāng)中的工作都是“暫停”的狀態(tài)拴竹。
2.3 觀察目前的背景工作狀態(tài):jobs
如果我們想知道有什么工作在背景中悟衩,就用jobs
這個指令。
一般來說栓拜,我們直接在命令行中輸入jobs
就可以了座泳,不過它還有一些參數(shù),可以根據(jù)需求添加
工作模式:jobs [-lrs]
選項與參數(shù):
-
-l
:除了列出 job number 與指令串之外幕与,同時列出PID的號碼 -
-r
:僅列出正在背景 run 的工作 -
-s
:僅列出正在背景當(dāng)中暫停(stop) 的工作
解釋一下 job number 后面的 “+” “-”符號:
+代表最近被放到背景的工作號碼
- 代表最近最后第二個被放到背景中的工作號碼
超過最后第三個以后的工作挑势,就不會有+/-符號存在了
這里的意義在于:就像??圖中的情況,如果我們直接輸入fg
時(fg是 “將背景工作拿到前景來處理” 的命令) 啦鸣,那個伴隨"+"的job[2]會被預(yù)設(shè)拿到前景中來處理
2.4 將背景工作拿到前景來處理 : fg(foreground)
- 工作模式:
fg %jobnumber
- 選項與參數(shù)
%jobnumber
jobnumber為工作號碼(數(shù)字) ## 注意潮饱,那個%是可有可無的
2.5 讓工作在背景下的狀態(tài)變成運(yùn)作中:bg
鳥哥在下面這個圖中講得很詳細(xì),工作模式和fg相同
2.6 管理背景當(dāng)中的工作 kill
如果我們想要將工作移除诫给,可以使用kill這個命令香拉,當(dāng)然它還有一些參數(shù)來作為輔助
工作模式:kill -signal %jobnumber
常見參數(shù)介紹
-l
注意這里是L的小寫,列出目前kill能夠使用的參數(shù)有哪些
-1
重新讀取一次參數(shù)的配置文件
-2
代表與由鍵盤輸入 [ctrl] -c 同樣的動作
-9
立刻強(qiáng)制刪除一個工作
-15
以正常的進(jìn)程方式終止一項工作中狂。與-9不一樣
想要了解signal的更多信息:man 7 signal
去查詢相關(guān)資料
這里解釋一下kill -9
和 kill -15
凫碌,當(dāng)然推薦大家都使用 kill -15
,如果是迫不得已再使用kill -9
吃型。因?yàn)橛械倪M(jìn)程在運(yùn)行過程中會產(chǎn)生一些文本证鸥,kill -15
在kill進(jìn)程時會將與進(jìn)程相關(guān)的一切(包括中間生成的文本)一并刪除。而kill -9
會強(qiáng)制得將工作移除掉,而一些中間產(chǎn)物會繼續(xù)存在文件系統(tǒng)里枉层。
注意:kill 后面接的數(shù)字默認(rèn)是PID泉褐,如果想要管理bash的工作控制,必須使用
kill -signal %jobnumber
的形式(不同于fg
)
3. 脫機(jī)管理問題
很多小伙伴剛接觸linux時鸟蜡,會把 &
放到背景中運(yùn)行的模式當(dāng)作放到系統(tǒng)的背景去膜赃,這么理解就錯了。
我們之前在“工作管理”中提到的“背景”指的是bash的背景(也就是說揉忘,指的是在終端機(jī)模式下可以避免ctrl -c中斷的一個情景)跳座,而不是放到系統(tǒng)的背景去。如果不好理解泣矛,舉個例子:如果你是以遠(yuǎn)程聯(lián)機(jī)的方式連接到你的Linux主機(jī)(terminal 或 putty)疲眷,并且以&的方式放到背景去,如果工作尚未結(jié)束你就exit脫機(jī)了您朽,你放在bash背景中的未完成的工作就會被中斷的狂丝。
那該怎么辦呢?如果我的工作需要進(jìn)行一大段時間(>24h)哗总,總不能一直守著自己的終端機(jī)几颜,開著遠(yuǎn)程聯(lián)機(jī)軟件肉眼看著吧。對于這種情況讯屈,我們可以將工作放置在系統(tǒng)背景蛋哭,這樣就與終端機(jī)無關(guān)了。
因此涮母,這種情況我們可以使用at
和 nohup
3.1 nohop
nohup
可以讓你在脫機(jī)或注銷系統(tǒng)后谆趾,還能夠讓工作繼續(xù)進(jìn)行,它的工作模式
nonhup [指令與參數(shù)] 命令 &
這樣就可以在系統(tǒng)背景中運(yùn)行
3.2 at
at
這個指令通常是用在僅執(zhí)行一次的工作排程里(將某些工作排進(jìn)進(jìn)程表中哈蝇,在指定的時間執(zhí)行)棺妓。當(dāng)然,由于涉及系統(tǒng)安全問題炮赦,不是每個人都可以使用at的。查看/etc/at.allow(可以使用的名單) 和 /etc/at.deny(不可以使用的名單)兩個文件样勃,如果兩個文件都不存在吠勘,那么只有root可以使用at這個命令。
- at 的運(yùn)作方式
使用at這個指令來產(chǎn)生所要運(yùn)作的工作峡眶,實(shí)質(zhì)上剧防,是將待運(yùn)行的工作以文本的方式寫入/var/sool/at/目錄內(nèi)。通過這種方式辫樱,便能通過atd這個服務(wù)峭拘,進(jìn)行工作的取用與執(zhí)行。
- at 的工作管理
atq
查詢目前主機(jī)上有多少at工作排程
atrm (jobnumber)
刪除錯誤的命令