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