當然,解決的方式有很多,如在應用中屏蔽中斷信號、使用chroot方式訪問等。但這些方法都有一些限制,如需要修改應用,讓telnet等支持chroot方式(ssh可支持chroot)等。而使用trap也是一種比較好的解決方法。
一、關於信號
歷史上,shell總是用數字來代表信號,而新的腳本程序應該使用信號的名字,它們保存在用#include命令包含進來的signal.h頭文件中,在使用信號名時需要省略SIG前綴。
kill和trap等都可以看到信號編號及其關聯的名稱。“信號”是指那些被異步發送到一個程序的事件。默認情況下,它們通常會終止一個程序的運行。
引用
# trap -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
附錄中有個說明文檔。
二、trap 的使用
1、運行格式
trap命令的參數分為兩部分,前一部分是接收到指定信號時將要采取的行動,後一部分是要處理的信號名。
trap command signal
它有三種形式分別對應三種不同的信號回應方式。
第一種:
trap "commands" signal-list
當腳本收到signal-list清單內列出的信號時,trap命令執行雙引號中的命令。
第二種:
trap signal-list
trap不指定任何命令,接受信號的默認操作,默認操作是結束進程的運行。
第三種:
trap " " signal-list
trap命令指定一個空命令串,允許忽視信號,我們用到的就是這一種。
※ 請記住,腳本程序通常是以從上到下的順序解釋執行的,所以必須在你想保護的那部分代碼以前指定trap命令。
2、測試
按照用戶的要求,我們需要屏蔽的是HUP INT QUIT TSTP幾個信號。所以,可以運行:
# trap "" HUP INT QUIT TSTP
這個時候,可以試試打開一個持續的命令,然後中斷其運行,例如:
# tail -f /var/log/messages
接著,試試用Ctrl+C 或 Ctrl+\ 來中斷試試,會程序是不會退出的。
3、恢復信號
如果想恢復的話,可以用Ctrl+Z把程序放到後台,然後運行:
# trap : HUP INT QUIT TSTP
然後,用ps -ef看看其PID號,bg 1讓程序繼續運行,最後用kill 殺掉即可。
4、其他
您也可以試試運行:
# trap "echo 'Hello World' " HUP INT QUIT TSTP
這樣,當您運行Ctrl+C 等中斷時,會自動運行echo命令,結果就是現實Hello World字符串:
引用
# tail -f /var/log/messages
May 18 16:57:54 192.168.228.153 dhcpd: DHCPREQUEST for 192.168.228.221 from 00:1d:72:92:d4:68 via eth0
May 18 16:57:54 192.168.228.153 dhcpd: DHCPACK on 192.168.228.221 to 00:1d:72:92:d4:68 via eth0
[root@mail ~]# Hello World
※ 注意,這方式並不能屏蔽中斷,敲入Ctrl+C 等信息後,仍以默認行為動作的,也就是退出程序,僅會再運行一個額外的命令而已。