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