【Linux】一步一步学Linux——trap命令(229)
00. 目錄
文章目錄
- 00. 目錄
- 01. 命令概述
- 02. 命令格式
- 03. 常用選項
- 04. 其它說明
- 05. 參考示例
- 06. 附錄
01. 命令概述
trap命令用于指定在接收到信號后將要采取的動作,常見的用途是在腳本程序被中斷時完成清理工作。當shell接收到sigspec指定的信號時,arg參數(命令)將會被讀取,并被執行。
02. 命令格式
用法:trap [-lp] [[參數] 信號聲明 ...]03. 常用選項
-l 讓shell打印一個命令名稱和其相對應的編號的列表 -p 打印與每一個信號有關聯的命令的列表 缺省 每個接收到的sigspec信號都將會被重置為它們進入shell時的值 -f 阻止中斷信號04. 其它說明
選項參數說明
如果arg參數缺省或者為“-”,每個接收到的sigspec信號都將會被重置為它們進入shell時的值;
如果arg是空字符串每一個由sigspec指定的信號都會被shell和它所調用的命令忽略;
如果有-p選項而沒有提供arg參數則會打印所有與sigspec指定信號相關聯的的trap命令;
如果沒有提供任何參數或者僅有-p選項,trap命令將會打印與每一個信號有關聯的命令的列表;
-l選項的作用是讓shell打印一個命令名稱和其相對應的編號的列表。
每個sigspec信號都是是以名字或者編號的形式定義在signal.h頭文件中,信號的名字是不區分大小寫的,其前綴SIG是可選的,如果某個信號是 EXIT(0),那么arg指定的命令將會在shell上執行退出命令時執行(If a sigspec is EXIT (0) the command arg is executed on exit from the shell),如果sigspec是DEBUG,那么arg指定的命令將會在以下每個命令執行之前執行:
簡單命令,for語句,case語句,select命令,算法命令,在函數內的第一條命令。
更多trap debug的使用可以參考extdebug選項說明。
如果sigspec是ERR,arg參數指定的命令將會在任何簡單命名執行完后返回值為非零值時執行,但是也有以下例外情況:
在以上情況中如果sigspec是ERR,arg命令不會執行,這些規則同樣適用于errexit選項。如果sigspec是RETURN,arg指定的命令在每次shell函數或者腳本用"."或者內置的命令執行完成后執行,在shell入口處被忽略的命令 是沒法被trap和reset的,被trap的信號,在創建的子進程中使用時會在子進程被創建時被重置為原始的值。如果trap使用的sigspec信號 是invalid的信號則trap命令返回false(失敗),否則返回成功(true)。
信號
信號是一種進程間通信機制,它給應用程序提供一種異步的軟件中斷,使應用程序有機會接受其他程序活終端發送的命令(即信號)。應用程序收到信號后,有三種處理方式:忽略,默認,或捕捉。進程收到一個信號后,會檢查對該信號的處理機制。如果是SIG_IGN,就忽略該信號;如果是SIG_DFT,則會采用系統默認的處理動作,通常是終止進程或忽略該信號;如果給該信號指定了一個處理函數(捕捉),則會中斷當前進程正在執行的任務,轉而去執行該信號的處理函數,返回后再繼續執行被中斷的任務。
在有些情況下,我們不希望自己的shell腳本在運行時刻被中斷,比如說我們寫得shell腳本設為某一用戶的默認shell,使這一用戶進入系統后只能作某一項工作,如數據庫備份, 我們可不希望用戶使用Ctrl c之類便進入到shell狀態,做我們不希望做的事情。這便用到了信號處理。
以下是一些你可能會遇到的,要在程序中使用的更常見的信號:
| SIGHUP | 1 | 本信號在用戶終端連接(正常或非正常)結束時發出, 通常是在終端的控制進程結束時, 通知同一session內的各個作業, 這時它們與控制終端不再關聯。 登錄Linux時,系統會分配給登錄用戶一個終端(Session)。在這個終端運行的所有程序,包括前臺進程組和后臺進程組,一般都屬于這個Session。當用戶退出Linux登錄時,前臺進程組和后臺有對終端輸出的進程將會收到SIGHUP信號。這個信號的默認操作為終止進程,因此前臺進程組和后臺有終端輸出的進程就會中止。對于與終端脫離關系的守護進程,這個信號用于通知它重新讀取配置文件。 |
| SIGINT | 2 | 程序終止(interrupt)信號, 在用戶鍵入INTR字符(通常是Ctrl C)時發出。 |
| SIGQUIT | 3 | 和SIGINT類似, 但由QUIT字符(通常是Ctrl /)來控制. 進程在因收到SIGQUIT退出時會產生core文件, 在這個意義上類似于一個程序錯誤信號。 |
| SIGFPE | 8 | 在發生致命的算術運算錯誤時發出. 不僅包括浮點運算錯誤, 還包括溢出及除數為0等其它所有的算術的錯誤。 |
| SIGKILL | 9 | 用來立即結束程序的運行. 本信號不能被阻塞, 處理和忽略。 |
| SIGALRM | 14 | 時鐘定時信號, 計算的是實際的時間或時鐘時間. alarm函數使用該信號。 |
| SIGTERM | 15 | 程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理. 通常用來要求程序自己正常退出. shell命令kill缺省產生這個信號。 |
捕獲信號
當你按下 Ctrl + C 鍵或 Break 鍵在終端一個shell程序的執行過程中,正常程序將立即終止,并返回命令提示符。這可能并不總是可取的。例如,你可能最終留下了一堆臨時文件,將不會清理。
捕獲這些信號是很容易的,trap命令的語法如下:
$ trap commands signals這里的命令可以是任何有效的Linux命令,或一個用戶定義的函數,信號可以是任意數量的信號,你想來捕獲的列表。
在shell腳本中的陷阱有三種常見的用途:
05. 參考示例
5.1 清理臨時文件
[deng@localhost ~]$ trap "rm -rf /tmp/*.bak; exit" 2 [deng@localhost ~]$5.2 忽略信號
[deng@localhost ~]$ trap '' 2 [deng@localhost ~]$5.3 恢復信號的默認操作
[deng@localhost ~]$ trap 2 [deng@localhost ~]$06. 附錄
參考:【Linux】一步一步學Linux系列教程匯總
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【Linux】一步一步学Linux——trap命令(229)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux】一步一步学Linux——x
- 下一篇: 【Linux】一步一步学Linux——a