10个 Linux/Unix下 Bash 和 KSH shell 的作业控制实例
Linux 和 Unix 屬于多任務(wù)的操作系統(tǒng),也就是說一個系統(tǒng)在同一時間段內(nèi)能運行多重任務(wù)(進程)。在這個新的博客系列,我將會列出相關(guān)的 Linux 和 Unix 作業(yè)(job)控制的命令,你可以通過這些命令在 Bash 或 Korn 還有 POSIX shell 下實現(xiàn)執(zhí)行多重任務(wù)。
什么是作業(yè)控制?
作業(yè)控制不只是能夠停止/掛起(stop/suspend)正在執(zhí)行的進程(命令),也可以繼續(xù)/喚醒(continue/resume)執(zhí)行你需要的每一個進程。這完全可以用你的操作系統(tǒng)和 bash/ksh 之類的 shell 或 POSIX shell 完成。
誰給作業(yè)控制的提供了環(huán)境?
Bash / Korn shell,或者是 POSIX shell 提供給了作業(yè)控制的環(huán)境。
跟作業(yè)表打個招呼吧
你的 shell 會留有一張當(dāng)前作業(yè)的表單,稱為作業(yè)表。當(dāng)你鍵入命令時,shell 會給它分配一個 jobID(也稱作 JOBSPEC)。一個 jobID 或 JOBSPEC只是很小的整數(shù)數(shù)值。
#1: 創(chuàng)建你的首個 Linux/Unix 作業(yè)
我要運行一個名為 xeyes 的命令,它會在屏幕上顯示兩個橢圓的眼睛,輸入: $ xeyes &
輸出樣例:
Fig.01: 在后臺運行 xeyes 命令
我使用&符號讓一個 job 在后臺運行。shell 會打印一行信息類似如下:
在這個例子中,有兩個數(shù)字輸出,分別表示:
- 1?: 在后臺執(zhí)行的 xeyes 任務(wù)的作業(yè)號為 1。
- 6891 : 作業(yè)1的進程ID。
我在多執(zhí)行一些 job:
#2: 列出當(dāng)前的作業(yè)
要查看當(dāng)前 shell 的激活的任務(wù)狀態(tài),輸入:
輸出如下:
簡要描述如下:
| 1 | [1] | jobID?或?JOB_SPEC?- 工作號要與fg, bg, wait, kill和其他shell命令一起使用。你必須在工作號前綴添加一個百分號:(%)。 加號 (+) 標(biāo)識著默認的或是現(xiàn)在的作業(yè)。 減號 (-) 標(biāo)識著前一個作業(yè)。 | %1 fg %1 kill %2 |
| 2 | 9379 | 進程 ID?- 系統(tǒng)自動為每個進程創(chuàng)建并分配地獨有的身份標(biāo)志號。 | kill 9379 |
| 3 | Running | 狀態(tài)?- 關(guān)于作業(yè)的狀態(tài): Running?- 該 作業(yè)正在運行,還沒有被外部信號掛起。 Stopped?- 該作業(yè)已經(jīng)被掛起。 | N/A |
| 4 | xeyes & | command?- 由shell給出的命令。 | script & firefox url& |
你也可以用 ps 命名列出當(dāng)前系統(tǒng)正在運行的進程:
#3: 停止或掛起正在運行的作業(yè)
按下[Ctrl]-[Z]鍵或使用kill 命令,如下所示:
舉個例子,啟動ping 命令,然后用 Ctrl-Z 鍵來停止 ping 命令作業(yè):
Animated gif 01: 掛起 ping 命令作業(yè)
#4: 在前臺恢復(fù) 掛起的/停止的作業(yè)
讓我們恢復(fù)處于停止?fàn)顟B(tài)下的作業(yè),讓它回到前臺繼續(xù)運行,要將其變成當(dāng)前作業(yè),必須借助fg 命令。具體語法如下:
我也可以規(guī)定命令行開端符合字符串"ping"的作業(yè)[譯注:不能出現(xiàn)不明確的字符串,例如如果后臺有兩個 vim 進程而你敲入 fg %vim 會報錯。]:
輸出樣例:
#5: 在后臺恢復(fù) 掛起/停止?fàn)顟B(tài)的作業(yè)
在這個例子中,我使用yum 命令更新所有安裝在 Redhat 或 CentOS Linux 生產(chǎn)服務(wù)器上的軟件包并置于后臺作業(yè)。
然而,由于一些原因(例如,過載問題)我決定停止這個作業(yè)20分鐘:
輸出樣例:
用 bg 重啟停止在后臺的 yum 進程
現(xiàn)在,我將要恢復(fù)停止的 yum -y update &>/root/patch.log & 作業(yè),鍵入:
或者:
輸出樣例:
#6: 殺死作業(yè)/進程
殺死yum 命令進程,輸入如下kill 命令及其作業(yè)號 7:
或者
輸出樣例:
在 Linux/FreeBSD/OS X Unix 下你也可以使用 killall 命令通過名字殺死進程或是 jobID 而不是通過 PID?
#7 為什么當(dāng)我登出后 shell 會清除我的所有后臺作業(yè)
在這個例子中,我將會啟動 pdfwriter.py 來批量生成這個站點的 pdf 文件:
一旦當(dāng)我登出shell時,pdfwriter.py 作業(yè)就會被我的 shell 殺死。為了克服這個問題需要使用shell的內(nèi)置命令 disown 來告訴 shell 不要發(fā)送 HUP 信號,鍵入:
#8 使用一個名為 nohup 的外部命令阻止在登出時殺死作業(yè)
你也可以使用nohup 命令在你退出 shell 后執(zhí)行作業(yè):
#9: 查找最后的作業(yè)的 PID
為了查找最近在后臺執(zhí)行的(異步)命令的進程ID,可使用 bash shell 的特殊參數(shù) $!
輸出樣例:
#10: 等候作業(yè)完成
wait 命令會等候給予的進程ID 或 作業(yè)ID指定的進程,然后報告它的終止?fàn)顟B(tài)。語法如下:
這是我的一個工作腳本:
Linux 和 Unix 作業(yè)控制命令總結(jié)列表
| & | 將作業(yè)置入后臺 | 命令 & |
| %n | 設(shè)置作業(yè)號為 n (數(shù)字)的作業(yè) | 命令 %1 |
| %Word | 引用命令行開端包含 Word 的作業(yè) | 命令 %yum |
| %?Word | 引用命令行包含 Word 的作業(yè) | 命令 %?ping |
| %% %+ | 引用當(dāng)前作業(yè) | kill %% kill %+ |
| %- | 引用先前作業(yè) | bg %- |
| CTRL-Z kill -s stop jobID | 掛起或停止作業(yè) | kill -s stop %ping |
| jobs jobs -l | 列出活動的作業(yè) | jobs -l |
| bg | 將 作業(yè)置入后臺 | bg %1 bg %ping |
| fg | 將作業(yè)置入前臺 | fg %2 fg %apt-get |
關(guān)于 shell 內(nèi)置命令和外部命令的小注
運行下面的 type 命令找出給予命令是否屬于內(nèi)部或外部的。
輸出樣式:
在幾乎所有情況下,你都需要使用 shell 的內(nèi)置命令。所有外部命令例如 /usr/bin/fg 或 /usr/bin/jobs 工作在一個不同的 shell 環(huán)境下,而不能用在父 shell 的環(huán)境下。
總結(jié)
我希望你能喜歡這篇博文系列(rss 訂閱),我建議你閱讀下面的更多信息:
- 在我們的 faq 章節(jié)查閱有關(guān)進程管理的文章disoen 命令示例,jobs 命令示例,bg 命令示例,和fg 命令示例。
- Man pages?bash(1),?ksh(1),?ps(1),?kill(1)
- Korn shell (ksh93) 文檔.
- NU bash shell 文檔.
原文發(fā)布時間為:2014-03-13
本文來自云棲社區(qū)合作伙伴“Linux中國”
總結(jié)
以上是生活随笔為你收集整理的10个 Linux/Unix下 Bash 和 KSH shell 的作业控制实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做梦梦到绣花鞋是什么意思
- 下一篇: 做梦梦到蛇吃鱼是什么意思周公解梦