標籤:style color 使用 檔案 ar div 代碼 工作
1.進程ID和作業編號 當通過附加&號後運行命令時,shell會響應如下:
$ ls &
[1] 3318
其中[1]是作業號,3318是進程號。一個後台進程完成時,shell會給出作業編號資訊,如下:[1]+ Done ls --color=auto
如果作業以非0狀態退出時,shell指出其退出狀態。
2.作業控製作業編號可以使它們在shell命令中進行作業控制。一旦作業在後台運行,你可以讓它一直運行,或把它放到前台,或向其發送訊號。
2.1.前台和後台內建fg命令將後台作業放到前台。使用不帶參數的fg,shell會把後台作業放到前台,如果有多個作業在後台,shell會挑出最新在後台運行作業放到前台。如果想要將其他作業放到前台,需要給出前面加上百分比符號%的作業命令,或者使用作業編號前面加百分比符號%,也可以是不帶百分比符號的進程ID。可以使用命令jobs列出後台作業。例如:[email protected]:~/ctest$ ./a &
[1] 3481
[email protected]:~/ctest$ ./b &
[2] 3482
[email protected]:~/ctest$ ./c &
[3] 3483
[email protected]:~/ctest$ jobs
[1] Running ./a &
[2]- Running ./b &
[3]+ Running ./c &
-p選項只列出進程號:
$ jobs -p
3481
3482
3483
如果鍵入fg,會把c放到前台,因為它是最新在後台啟動並執行作業。如果鍵入fg %b,或者fg %2,b會進入前台。還可以通過%+引用被放到背景最新作業,通過%-引用下一個最近被放到背景作業。這邊是b。
下面列出了引用後台作業的幾種方式:%N 作業編號N%string 其命令以string開始的作業%?string 其命令包含string的作業%+ 最近被調用的後台作業%% 同上%- 第二個最近被調用的背景程式
2.2.掛起一個作業要掛起一個作業,在其運行時鍵入ctrl-z即可。shell會相應如下訊息:$ ./a
^Z
[1]+ Stopped ./a
然後返回shell提示符,要恢複一個掛機的作業使其繼續在前台執行,鍵入fg即可。如果有多個掛起的作業,可以使用帶有一個作
業名或者編號的fg。
[email protected]:~/ctest$ jobs
[1] Stopped ./a
[2]- Stopped ./b
[3]+ Stopped ./c
[email protected]:~/ctest$ fg %1
./a
如果鍵入ctrl-z後跟bg,就會把該作業放到後台運行。
[email protected]:~/ctest$ jobs
[1] Stopped ./a
[2]- Stopped ./b
[3]+ Stopped ./c
[email protected]:~/ctest$ bg %2
[2]- ./b &
[email protected]:~/ctest$ jobs
[1]- Stopped ./a
[2] Running ./b &
[3]+ Stopped ./c
3.訊號3.1.修飾鍵訊號鍵入ctrl-c時,shell發送INT訊號給當前作業,鍵入ctrl-z時,shell則發送TSTP。也可以向當前作業發送一個QUIT訊號,方法是鍵入ctrl-\。可以使用stty命令選項定製發送訊號的修飾鍵。這一點隨系統的不同而變化,通常的文法是:stty signame char。signame時訊號名,char是控制字元,可通過使用^符號表示控制後跟控制字元給出。例如,要將INT鍵設定為大多數系統上的ctrl-x,可使用:stty intr ^x。
3.2.kill可以使用內建shell命令kill向你建立的任何進程發送一個訊號,kill的參數為進程ID,作業編號。預設情況下,kill發送TERM訊號,其效果與使用ctrl-c發送的INT訊號一樣。下面是kill的例子。這裡有一個a進程,進程號是2680,作業號時1,開始可以使用如下命令:
# ./a &
[1] 2680
# kill %1
[1]+ Terminated ./a
如果沒有看到該訊息,TERM訊號中斷作業失敗,下一步再試試QUIT:
kill -QUIT %1
如果工作正常會看到:
[1]+ Quit (core dumped) ./a
如果QUIT也不正常運行,自後一種方式是使用KILL:
# kill -KILL %1
[1]+ Killed ./a
3.3.trap
trap內建命令使你可以設定為捕獲特定訊號並以自己的方式處理它們。trap內建命令使你可以在一個shell指令碼中完成此功能。trap的文法是:trap cmd sig1 sig2 ...意思是 sig1,sig2等被接收時,運行cmd,然後恢複執行,cmd完成後,指令碼在被打斷的命令後恢複執行。cmd可以為指令碼或者函數。sigs可用名稱或數字指定。例如:trap "echo ‘you hit ctrl-c‘" INT
while true; do
sleep 60
done
執行:# ./a.sh
^Cyou hit ctrl-c
^Cyou hit ctrl-c
按下ctrl-c後,指令碼不會停止運行,而是sleep命令退出,指令碼會迴圈回來啟動另一個sleep。
3.4.進程ID變數$$是一個特殊shell變數,取值為當前shell的進程ID。例如如下指令碼:echo $$
while true; do
sleep 10
done
執行結果:[email protected]:/home/yanwenjie/bashtest# ./a.sh &
[1] 3258
[email protected]:/home/yanwenjie/bashtest# 3258
3.5.重設陷阱訊號另一個trap命令的特例發生在將短劃線指定為命令參數時。它會將收到訊號時的行為重設為預設欣慰,通常是進程的終止。例如a.sh如下所示:$ cat a.sh
trap "echo ‘ctrl c is received‘" INT
i=5
while [ $i -gt 0 ]; do
sleep 5
i=$((i-1))
done
trap - INT
i=5
while [ $i -gt 0 ]; do
sleep 5
i=$((i-1))
done
執行指令碼:$ ./a.sh
^Cctrl c is received
^Cctrl c is received
^Cctrl c is received
^Cctrl c is received
^Cctrl c is received
^C
4.協同程式例如下面的指令碼:
alice &hatter此時hatter時指令碼中最後一個命令,上述代碼只有當alice首先完成時,才能工作正常。如果當指令碼完成時,alice仍然運行,那麼它就變成孤兒。有一種方法可以確保alice完成前指令碼不會完成:內建命令wait。不帶參數時,wait指示等待,直至所有後台作業完成,因此要確保上述代碼工作正常,加入wait如下:alice &hatterwait這裡,如果hatter先完成, 父shell在結束自己前會等待alice完成。
5.子shell5.1.子shell繼承關於子shell最關鍵的一點是它們從其父shell獲得或繼承了如下特性:
- 目前的目錄
- 環境變數
- 標準輸入,標準輸出和標準錯誤,以及其它任何開啟的檔案描述符。
- 被忽略的訊號。
子shell未從其父shell繼承的內容如下:
5.2.嵌套子shell子shell不需要放在單獨的指令碼中,你也可以在與父shell相同的指令碼中啟動子shell。可以把某些shell代碼放到圓括弧中,則該代碼將運行在子shell。我們稱之為嵌套子shell。例如:( while read line; do echo $linedone) | dc圓括弧內代碼會運行為一個單獨的進程。這通常不如一個命令塊效率高。子shell和命令塊在功能上的差別很少;它們之間的主要區別是範圍;亦即在該範圍內一些定義是已知的,如shell變數和訊號陷阱。首先,嵌套子shell內的代碼服從上述子shell繼承規則,除此之外還直到外部shell中定義的變數,塊可以看做繼承了外部shell的一切內容的代碼單元。第二,一個命令塊中定義的變數和訊號陷阱對塊後的shell代碼時已知的,而在子shell中則不是。