trap在shell中捕捉訊號

來源:互聯網
上載者:User

標籤:

一、trap捕捉到訊號之後,可以有三種反應方式:
(1)執行一段程式來處理這一訊號
(2)接受訊號的預設操作
(3)忽視這一訊號

二、trap對上面三種方式提供了三種基本形式:
第一種形式的trap命令在shell接收到signal list清單中數值相同的訊號時,將執行雙引號中的命令串。
trap ‘commands’ signal-list
trap “commands” signal-list
為了恢複訊號的預設操作,使用第二種形式的trap命令:
trap signal-list
第三種形式的trap命令允許忽視訊號
trap ” ” signal-list

三、注意:
(1) 對訊號11(段違例)不能捕捉,因為shell本身需要捕捉該訊號去進行記憶體的轉儲。
(2) 在trap中可以定義對訊號0的處理(實際上沒有這個訊號), shell程式在其終止(如執行exit語句)時發出該訊號。
(3) 在捕捉到signal-list中指定的訊號並執行完相應的命令之後, 如果這些命令沒有將shell程式終止的話,shell程式將繼續執行收到訊號時所執行的命令後面的命令,這樣將
很容易導致shell程式無法終止。
另外,在trap語句中,單引號和雙引號是不同的,當shell程式第一次碰到trap語句時,將把commands中的命令掃描一遍。此時若commands是用單引號括起來的話,那麼shell不會對commands中的變數和命令進行替換, 否則commands中的變數和命令將用當時具體的值來替換。

四、例子:忽略Ctrl+C:
在有些情況下,我們不希望自己的shell指令碼在運行時刻被中斷,比如說我們寫得shell指令碼設為某一使用者的預設shell,使這一使用者進入系統後只能作某一項工作,如Database Backup,我們可不希望使用者使用ctrl+C之類便進入到shell狀態,做我們不希望做的事情。這便用到了訊號處理。
kill -l可以列出系統的訊號名稱,如下:
# kill -l
1) SIGHUP    2) SIGINT    3) SIGQUIT   4) SIGILL
5) SIGTRAP   6) SIGABRT   7) SIGBUS    8 ) SIGFPE
9) SIGKILL   10) SIGUSR1   11) SIGSEGV   12) SIGUSR2
13) SIGPIPE   14) SIGALRM   15) SIGTERM   17) SIGCHLD
18) SIGCONT   19) SIGSTOP   20) SIGTSTP   21) SIGTTIN
22) SIGTTOU   23) SIGURG   24) SIGXCPU   25) SIGXFSZ
26) SIGVTALRM  27) SIGPROF   28) SIGWINCH  29) SIGIO
30) SIGPWR   31) SIGSYS   34) SIGRTMIN  35) SIGRTMIN+1
36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
64) SIGRTMAX
通常我們需要忽略的訊號有四個,即:HUP, INT, QUIT, TSTP,也就是訊號1, 2, 3, 24使用這樣的語句可以使這些中斷訊號被忽略:
trap “” 1 2 3 24 或 trap “” HUP INT QUIT TSTP
用 trap :1 2 3 24 或 trap HUP INT QUIT TSTP使其回複預設值。
用stty -a可以列出中斷訊號與鍵盤的對應,分別執行上面的命令後,運行
tail -f /etc/passwd
然後嘗試用鍵盤中斷,試試兩種情況(預設和忽略)下有何不同。
更方便的是我們可以用在shell中用trap定義我們自己的訊號處理常式,就象在c中用signal一樣,如:
trap “echo ‘GO Away’” INT
                                                        

trap在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.