《學習bash》筆記--進程處理

來源:互聯網
上載者:User

標籤: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繼承的內容如下:
  • 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中則不是。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.