在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,如需轉載請自行聯系原作者