bash參考手冊之七(作業控制)

7 作業控制

本章討論什麼是作業控制,如何工作,和Bash提供了何種工具以控制作業。
作業控制基礎: 作業控制是如何工作的。
作業控制內建命令: 與作業控制交互的Bash內建命令。
作業控制變量: Bash用來定製化作業控制的變量。

7.1 作業控制基礎
作業控制是指一種能力:有選擇地停止(掛起)進程的執行,和在之後某個點繼續(恢復)它們的執行。用戶典型地使用這種工具的方式,是通過操作系統內核的終端驅動器和Bash聯合提供的交互接口。

shell連接一個作業和一個管道。shell保持一個表格——其內容是當前正在執行的作業,可以使用命令jobs列出。當Bash異步啓動一個作業時,它打印這樣一行:
    [1] 25647

含義爲:該作業的作業號碼是1,和這個作業聯繫的管道中的上一個進程的進程ID是25647。在單一管道中的所有進程是同一個作業的成員。Bash使用 job 抽象概念作爲作業控制的基礎。
爲了便於作業控制的用戶接口的實現,操作系統維護一個當前終端進程組ID的概念。這個進程組(進程組ID等於當前終端進程組ID那些進程)的成員,接收鍵盤產生的信號,比如SIGINT。這些進程被稱爲前臺進程。後臺進程是那些進程組ID和終端進程組ID不同的進程,這些進程無視鍵盤產生的信號。僅僅前臺進程允許從終端讀——如果用戶指定了 stty tostop,則可以向終端寫。後臺進程試圖從終端讀時,(當 stty tostop被設定有效時,向終端寫),由內核的終端驅動器發給它一個 SIGTTIN (SIGTTOU)  信號,除非該信號被捕獲,否則掛起該後臺進程。
如果運行Bash的操作系統支持作業控制,則Bash包含使用它的工具。在一個進程正在運行時,鍵入 suspend 字符(典型地 ‘^Z’, Control-Z),會導致該進程被停止,並返回控制到Bash。鍵入 delayed suspend 字符(典型地 ‘^Y’, Control-Y),導致該進程在它試圖從終端讀取時停止,並返回控制到Bash。用戶可以控制該作業的狀態,使用命令 bg 使它繼續在後臺運行, 命令 fg 使它繼續在前臺運行,或命令kill 殺掉該進程。 ‘^Z’ 立即生效,並且有這樣的副作用:引起丟棄後續的輸出和先前的輸入。
shell中有很多方法參照一個作業。字符 ‘%’ 引出一個作業描述(jobspec)。
作業號n可以用  ‘%n’ 來參照。 符號  ‘%%’ 和 ‘%+’ 參照shell的當前作業,該作業是上一個在前臺停止的作業,或者在後臺啓動的作業。單一的 ‘%’ (不帶作業描述)也指向當前的作業。前一個作業可以用  ‘%-’ 來參照。如果只有一個作業,則 ‘%+’ 和 ‘%-’ 都可以被用來指向同一個作業。在輸出,與作業相關的(例如,命令jobs的輸出),當前作業總是用 ‘+’ 標記,而前一個作業帶 ‘-’ 標記。
一個作業也可以使用啓動它的名字的前綴,或者在該命令行中的一個子字符串來參照。例如:‘%ce’ =指向一個停止的 ce 作業。 另一方面,使用 ‘%?ce’  指向任何命令行包含字符串 ‘ce’ 的作業。如果前綴或者子字符串匹配多於一個作業,則Bash報告錯誤。
簡單地指定一個作業的名字,可以把它帶到前臺: ‘%1’ 與  ‘fg %1’ 同義,把作業1從後臺帶到前臺。類似的,‘%1 &’  繼續 作業1 在後臺的執行,相當於 ‘bg %1’ 。
shell在一個作業改變了狀態時,立刻就知道了。一般地,Bash直到在打印一個提示符前,才報告一個作業的狀態變化,以不中斷其他的輸出。 如果內建命令 set 的 -b 選項啓用了,Bash 立即報告該種改變(見 內建命令set 章節)。每個子進程退出時,都執行 SIGHLD 的陷阱。

當作業被停止時,打算退出Bash,(或者在作業運行時,如果 checkjobs 選項被啓用 —— 見 內建命令 shopt 章節),shell打印一條警告信息,如果 checkjobs 選項啓用了,則列出作業及其狀態。命令jobs用來檢測它們的狀態。如果再次企圖退出shell,並且中間沒有運行其他命令,則Bash不再打印其他警告,並且所有停止的作業都被終止。


7.2 作業控制內建命令
bg

bg [jobspec …]

恢復後臺裏被掛起的每一個作業jobspec的運行,和使用 ‘&’ 啓動作業的效果一樣。如果沒有指定 jobspec  ,則操作的是當前作業。返回狀態是0,除非未啓用作業控制時運行,或者在作業控制啓用情況下運行,找不到任何 jobspec ,或者指定了一個沒有以作業控制啓動的作業。
fg

fg [jobspec]

恢復前臺裏的作業 jobspec, 使得該作業成爲當前作業。如果 jobspec 未指定,則使用當前的作業。返回狀態是命令放置到前臺,或者非零——如果當作業控制被取消,或者作業控制啓用時運行, jobspec 沒有指定到一個有效的作業,或者 jobspec 指定了一個沒有以作業控制啓動的作業。
jobs

jobs [-lnprs] [jobspec]

jobs -x command [arguments]

第一個格式,列出活動的作業。選項具有如下含義:
-l
在一般信息之外,列出進程ID。
-n
僅僅顯示自最近一次用戶被通知作業的狀態之後,改變了狀態的作業。
-p
僅僅列出作業的進程組頭部的進程ID。
-r
限制僅僅顯示正在運行的作業。
-s
限制僅僅顯示已經停止的作業。
如果給定了 jobspec ,輸出信息僅限於相關作業。如果未提供 jobspec, 則列出所有作業的狀態。
如果提供了-x 選項, jobs 把在 command 或者arguments 中找到的 jobspec 替換爲相應的進程組ID,和執行的 command ,傳給它的 arguments,返回它的退出狀態。
kill

kill [-s sigspec] [-n signum] [-sigspec] jobspec or pid

kill -l [exit_status]

發送由 sigspec 或者 signum 指定的信號給由作業說明 jobspec 或者進程ID pid 對應的進程。 sigspec可以是一個大小寫不敏感的信號名字,比如 SIGINT(可以帶或不帶SIG前綴),或者一個信號數字,signum 是一個信號數字。如果 sigspec 和 signum 都沒有給定,則使用 SIGTERM。 -l 選項列出信號名字。如果當使用 -l 選項時,提供了參數, 則列出參數相應的信號名字,並且返回狀態是0。 exit_status 是一個數字,指定了一個信號數字,或者由一個信號終止的進程的退出狀態。如果至少有一個信號被成功發送了,則返回狀態是0,如果發生錯誤,或者有無效選項,則返回非0。

wait

wait [jobspec or pid ...]

等待,直到由每一個進程ID: pid 或者作業說明 jobspec 指定的子進程退出,並且返回狀態是等待的最後的命令的退出狀態。如果給定了作業說明,要等待該作業中的所有進程。如果沒有給定參數,等待所有當前活動的子進程,並且返回狀態是0。如果 jobspec 和 pid 都沒有指定shell 的活動子進程,返回狀態127。
disown

disown [-ar] [-h] [jobspec …]

沒有選項時,從活動作業表中移除每個 jobspec 。如果給了 -h 選項,則該作業不從表中移除,但是做一個標記,以使如果shell 收到 SIGHUP 時,不發送 SIGHUP 到該作業。如果沒有指定 jobspec ,而且也沒有給定 -a 或者 -r 選項,則使用當前作業。如果沒有指定 jobspec ,則 -a 選項意味着移除或者標記所有作業;不帶 jobspec 參數的 -r 選項限制操作僅僅針對正在運行的作業。
suspend

suspend [-f]

掛起當前的shell的執行,直到收到一個 SIGCONT 信號。登錄shell不能被掛起;-f 選項可以用來覆蓋此行爲,並強制掛起。
當作業控制沒有激活時,內建命令 kill 和 wait 不接受 jobspec 參數。必須提供進程ID作爲參數。

7.3 作業控制變量
auto_resume
這個變量控制shell如何和用戶和作業控制交互。如果此變量存在,則不帶重定向的單個單詞簡單命令,會被當做一個存在的作業再繼續的候選。不允許意思含糊;如果以該字符串開頭的作業多於1個,則選擇最近訪問的作業。已經停止的作業的名字,在這個上下文中,是用來啓動該作業的命令行。如果此變量被設置爲“exact” ,則提供的字符串必須完全匹配一個已經停止的作業的名字;如果此變量被設置爲 “substring” ,則提供的字符串必須匹配一個已經停止的作業的名字的子字符串。 “substring” 這個值提供了和 ‘%’ 作業ID(見 作業控制基礎 章節)相同的作用。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章