天天看點

Linux Shell之九 trap--陷阱觸發

   在script的執行過程中,有時候希望能實時處理系統傳來的信号,如使用者按了Ctrl-C。處理的方式分為兩種:接受信号或忽略信号。

    接受信号通常會對信号安排執行特定的指令,忽略信号主要是避免意外的狀況幹擾script的運作。像這種能譜捉特定資訊,并做出反應的機制稱為trap(陷阱觸發)。trap的應用和信号有關。

一、信号

1、程序編号PID

每個程序都是獨一無二的代碼,稱為程序編号(Process IDentification),簡稱PID。

ps auxw 或 ps -ef 列出記憶體所有程序

ps auxw | grep named | grep -v grep  找出包含named的行,排除包含grep 的行。

2、信号清單

kill -l 或 trap -l  列出系統定義的信号的清單

每個信号都有個特定的數字代碼,如SIGINT的代碼為2(信号名稱已SIG開頭,可以不寫,SIGINT和INT是相同的),信号名稱不分大小寫,在傳遞信号時,可用數字代碼,也可使用信号名稱。

"kill -1 程序号" 、"kill -HUP  程序号"、"kill -SIGHUP 程序号" 讓此程序号的程序重新開機,3種寫法效果一樣。

3、傳送信号的方法

"kill -信号 程序編号" 或 "kill -s 信号 程序編号" 或 "kill -n 信号 程序編号"

"-信号"可使用信号代碼或信号名稱。kill後可跟多個程序編号,kill會把指定的信号都傳遞給這些程序。如果省略"-信号"則預設傳送SIGTERM(代碼15,終止程序)信号給程序。

kill 2359(終止這個程序) kill -9 2359(強制終止進制) kill -KILL 2359(強制終止程序)

另外killall也可以傳送信号給程序,隻不過killall傳送的對象是程序的名稱。

killall -信号 程序名稱

4、常用的信号

HUP             1重新啟動程序

INT2按Ctrl-C鍵;中斷程序

QUIT3按Ctrl-\鍵;以核心轉儲的方式離開程序

TERM15終止程序

KILL9強制删除程序

STOP19暫停程序

CONT18繼續執行

TSTP20按Crtl-Z鍵;在終端中暫停程序

ABRT6放棄程序,并轉存核心資訊

SEGV11記憶體區段錯誤,并轉存核心資訊

最好的方式是使用信号名稱,因為生産環境不同的unix-like系統程序代碼可能不一樣,具體要用kill -l檢視

kill -TERM 程序編号 或 kill -15 程序編号

結束程序前有機會執行清理動作,沒有強制性(未必會結束)。 kill -KILL 程序編号 或kill -9 程序編号,不執行清理動作,馬上結束

kill -TSTP 程序編号或kill 20 程序編号,當執行Ctrl-Z時,對程序發出TSTP信号,通常把一個程式丢到背景去執行 ,按Ctrl-Z暫停,在執行bg,把它丢到背景執行,fg再調回前台。

需要注意的是如果把第一個程序放背景後,再把第二個程序放背景,此時bg隻顯示第二個程序,待第二個程序結束的時候,bg才會顯示第一個程序

可以使用jobs 來檢視目前放進背景暫停的程序,用fg n n為編号可以調出指定的背景暫停的程序。

二、trap的運用

1、trap的文法1  trap "觸發指令" 信号串行

    隻要系統産生特定信号,trap就會觸發指令。trap 'echo 123' ABRT ; kill -ABRT $$ 螢幕會出現123 $$代表目前shell程序編号

2、trap的文法2  trap - 信号串行

    如果trap文法中沒有觸發指令,而是-或空白,則可恢複信号串行的原本的作用。trap '-' ABRT 恢複ABRT原本的作用。

3、trap的文法3  trap '' 信号串行

    忽略系統發出的信号串行  trap '' INT Ctrl-C講失效,無法終止程序

4、trap的文法4  trap -p

    列出目前trap向shell注冊的信号清單。

本文轉自Jacken_yang 51CTO部落格,原文連結:http://blog.51cto.com/linuxnote/1641273,如需轉載請自行聯系原作者

繼續閱讀