概述
今天主要介紹一個trap命令,這個命令是用於指定在接收到信號後將要採取的動作。常見的用途是在腳本程序被中斷時完成清理工作。
01
關於信號
歷史上,shell總是用數字來代表信號,而新的腳本程序應該使用信號的名字,它們保存在用#include命令包含進來的signal.h頭文件中,在使用信號名時需要省略SIG前綴。
kill和trap等都可以看到信號編號及其關聯的名稱。“信號”是指那些被異步發送到一個程序的事件。默認情況下,它們通常會終止一個程序的運行。
運行Shell腳本時,如果按下快捷鍵Ctrl+c或Ctrl+x(x為其他字符),程序就會終止運行,
在有些情況下,我們並不希望Shell腳本在運行時被信號中斷,此時就可以使用屏蔽信號手段,讓程序忽略用戶輸入的信號指令,從而繼續運行Shell腳本程序。
簡單的說,Linux的信號是由一個整數構成的異步消息,它可以由某個進程發給其他的進程,也可以在用戶按下特定鍵發生某種異常事件時,由系統發給某個進程。
02
信號列表
在Linux下和信號相關的常見命令為kill和trap命令,執行kill -l或trap -l命令,可以列出系統支持的各種信號,多達64個
# trap -l
下列表示Linux系統中重要的信號
03
trap 的使用
1、運行格式
trap命令的參數分為兩部分,前一部分是接收到指定信號時將要採取的行動,後一部分是要處理的信號名。
trap command signal
它有三種形式分別對應三種不同的信號迴應方式。
第一種:
trap "commands" signal-list
當腳本收到signal-list清單內列出的信號時,trap命令執行雙引號中的命令。
第二種:
trap signal-list
trap不指定任何命令,接受信號的默認操作,默認操作是結束進程的運行。
第三種:
trap " " signal-list
trap命令指定一個空命令串,允許忽視信號,我們用到的就是這一種。
ps:腳本程序通常是以從上到下的順序解釋執行的,所以必須在你想保護的那部分代碼以前指定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 殺掉即可。
利用trap命令我們還可以實現跳板機,篇幅有限,這個後面在單獨介紹,感興趣的朋友可以關注一下~