Linux 之 進(jìn)程管理 -- 工作管理 (job control)

工作管理(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))

tar -zpcf /tmp/etc.tar.gz /etc &

其中 [1]為工作號(hào)碼(job number)與bash的控制有關(guān)
14432是該指令所觸發(fā)的PID
然后我們可以忽略它得繼續(xù)操作bash
任務(wù)完成后的提示:
背景任務(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.zip zip -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è)文件中。

數(shù)據(jù)流重導(dǎo)向

例如??,如此一來(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>

ctrl 和 z

不同于 前面提到的& 將程序丟到背景里,在預(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ù)
    %jobnumber jobnumber為工作號(hào)碼(數(shù)字) ## 注意,那個(gè)%是可有可無(wú)的

2.5 讓工作在背景下的狀態(tài)變成運(yùn)作中:bg

鳥(niǎo)哥在下面這個(gè)圖中講得很詳細(xì),工作模式和fg相同


bg讓在背景下暫停的工作運(yùn)作

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 -9kill -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)了。

因此,這種情況我們可以使用atnohup

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 的使用方法-1

at 的使用方法-2
  • at 的工作管理
    atq查詢目前主機(jī)上有多少at工作排程
    atrm (jobnumber) 刪除錯(cuò)誤的命令
    拿鳥(niǎo)哥的圖來(lái)理解
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一個(gè)程序被加載到內(nèi)存當(dāng)中運(yùn)行,那么在內(nèi)存內(nèi)的那個(gè)數(shù)據(jù)就被稱(chēng)為進(jìn)程(process)。進(jìn)程是操作系統(tǒng)上非常重要的概念...
    Zhang21閱讀 2,111評(píng)論 0 12
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,727評(píng)論 0 5
  • 進(jìn)程相關(guān)概念系統(tǒng)進(jìn)程管理工具任務(wù)計(jì)劃 一、進(jìn)程相關(guān)概念 定義:進(jìn)程(Process)是運(yùn)行中的程序的一個(gè)副本,是被...
    哈嘍別樣閱讀 666評(píng)論 0 0
  • 觀其大綱 第1部分Linux的基礎(chǔ)知識(shí)第1章Linux概述第2章Linux系統(tǒng)的安裝KickStart開(kāi)始自動(dòng)安裝...
    周少言閱讀 1,675評(píng)論 1 10
  • 周六的早上,林瀟瀟難得睡了個(gè)大大的懶覺(jué)。這段時(shí)間實(shí)在是太累了,學(xué)業(yè)上不敢放松,抽空還要趕去參加各個(gè)招聘會(huì)、準(zhǔn)備簡(jiǎn)歷...
    向日葵之海閱讀 371評(píng)論 0 0

友情鏈接更多精彩內(nèi)容