2分鐘瞭解Linux系統trap命令的來龍去脈

Linux 腳本語言 波波說運維 2019-05-23

概述

今天主要介紹一個trap命令,這個命令是用於指定在接收到信號後將要採取的動作。常見的用途是在腳本程序被中斷時完成清理工作。

2分鐘瞭解Linux系統trap命令的來龍去脈


01

關於信號

歷史上,shell總是用數字來代表信號,而新的腳本程序應該使用信號的名字,它們保存在用#include命令包含進來的signal.h頭文件中,在使用信號名時需要省略SIG前綴。

kill和trap等都可以看到信號編號及其關聯的名稱。“信號”是指那些被異步發送到一個程序的事件。默認情況下,它們通常會終止一個程序的運行。

運行Shell腳本時,如果按下快捷鍵Ctrl+c或Ctrl+x(x為其他字符),程序就會終止運行,

在有些情況下,我們並不希望Shell腳本在運行時被信號中斷,此時就可以使用屏蔽信號手段,讓程序忽略用戶輸入的信號指令,從而繼續運行Shell腳本程序。

2分鐘瞭解Linux系統trap命令的來龍去脈

簡單的說,Linux的信號是由一個整數構成的異步消息,它可以由某個進程發給其他的進程,也可以在用戶按下特定鍵發生某種異常事件時,由系統發給某個進程。


02

信號列表

在Linux下和信號相關的常見命令為kill和trap命令,執行kill -l或trap -l命令,可以列出系統支持的各種信號,多達64個

# trap -l
2分鐘瞭解Linux系統trap命令的來龍去脈

下列表示Linux系統中重要的信號

2分鐘瞭解Linux系統trap命令的來龍去脈


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 殺掉即可。

2分鐘瞭解Linux系統trap命令的來龍去脈


利用trap命令我們還可以實現跳板機,篇幅有限,這個後面在單獨介紹,感興趣的朋友可以關注一下~

2分鐘瞭解Linux系統trap命令的來龍去脈

相關推薦

推薦中...