溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux中trap命令怎么用

發(fā)布時間:2022-02-16 10:43:52 來源:億速云 閱讀:376 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細講解有關(guān)Linux中trap命令怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Linux常用命令trap命令主要用于指定在接收到信號后將要采取的動作、腳本程序被中斷時執(zhí)行清理工作。

Linux中trap命令怎么用

trap

捕捉信號和其他事件并執(zhí)行命令。

概要

 trap [-lp] [[arg] signal_spec ...]

選項

 -l    打印信號名稱以及信號名稱對應(yīng)的數(shù)字。 -p    顯示與每個信號關(guān)聯(lián)的trap命令。

參數(shù)

arg:接收到信號時執(zhí)行的命令。

signal_spec:信號名稱或信號名稱對應(yīng)的數(shù)字。

返回值

如果表達式執(zhí)行結(jié)果為成功時返回0,當(dāng)參數(shù) signal_spec 沒有指定有效值時返回1。

關(guān)于信號

信號是一種進程間通信機制,它給應(yīng)用程序提供一種異步的軟件中斷,使應(yīng)用程序有機會接受其他程序活終端發(fā)送的命令(即信號)。應(yīng)用程序收到信號后,有三種處理方式:忽略,默認,或捕捉。進程收到一個信號后,會檢查對該信號的處理機制。如果是SIG_IGN,就忽略該信號;如果是SIG_DFT,則會采用系統(tǒng)默認的處理動作,通常是終止進程或忽略該信號;如果給該信號指定了一個處理函數(shù)(捕捉),則會中斷當(dāng)前進程正在執(zhí)行的任務(wù),轉(zhuǎn)而去執(zhí)行該信號的處理函數(shù),返回后再繼續(xù)執(zhí)行被中斷的任務(wù)。

在有些情況下,我們不希望自己的shell腳本在運行時刻被中斷,比如說我們寫得shell腳本設(shè)為某一用戶的默認shell,使這一用戶進入系統(tǒng)后只能作某一項工作,如數(shù)據(jù)庫備份, 我們可不希望用戶使用 Ctrl+C 等方法進入到shell狀態(tài)做我們不希望做的事情。這便用到了信號處理。

以下是一些你可能會遇到的常見信號:

信號名稱信號數(shù)描述
SIGHUP1本信號在用戶終端連接(正?;蚍钦#┙Y(jié)束時發(fā)出,通常是在終端的控制進程結(jié)束時,通知同一session內(nèi)的各個作業(yè),這時它們與控制終端不再關(guān)聯(lián)。登錄Linux時,系統(tǒng)會分配給登錄用戶一個終端(Session)。在這個終端運行的所有程序,包括前臺進程組和后臺進程組,一般都屬于這個Session。當(dāng)用戶退出Linux登錄時,前臺進程組和后臺有對終端輸出的進程將會收到SIGHUP信號。這個信號的默認操作為終止進程,因此前臺進程組和后臺有終端輸出的進程就會中止。對于與終端脫離關(guān)系的守護進程,這個信號用于通知它重新讀取配置文件。
SIGINT2程序終止(interrupt)信號,在用戶鍵入 Ctrl+C 時發(fā)出。
SIGQUIT3和SIGINT類似,但由QUIT字符(通常是Ctrl /)來控制。進程在因收到SIGQUIT退出時會產(chǎn)生core文件,在這個意義上類似于一個程序錯誤信號。
SIGFPE8在發(fā)生致命的算術(shù)運算錯誤時發(fā)出。不僅包括浮點運算錯誤,還包括溢出及除數(shù)為0等其它所有的算術(shù)錯誤。
SIGKILL9用來立即結(jié)束程序的運行。本信號不能被阻塞,處理和忽略。
SIGALRM14時鐘定時信號,計算的是實際的時間或時鐘時間。alarm 函數(shù)使用該信號。
SIGTERM15程序結(jié)束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理. 通常用來要求程序自己正常退出;kill 命令缺省產(chǎn)生這個信號。

例子

當(dāng)shell收到 HUP INT PIPE QUIT TERM 這幾個命令時,當(dāng)前執(zhí)行的程序會執(zhí)行 exit 1。

 [root@pc root]$ trap "exit 1" HUP INT PIPE QUIT TERM

1 清理臨時文件

下面展示了如果有人試圖從終端中止程序時,如何刪除文件然后退出:

 trap "rm -f $WORKDIR/work1 $WORKDIR/dataout; exit" 2

執(zhí)行shell程序,如果程序接收信號為2,那么這兩個文件 (work1 和 dataout) 將被自動刪除。

添加信號1 SIGHUP

 $ trap "rm $WORKDIR/work1 $WORKDIR/dataout; exit" 1 2

2 忽略信號

如果陷阱列出的命令是空的,指定的信號接收時,將被忽略:

 $ trap '' 2

忽略多個信號:

 $ trap '' 1 2 3 15

3 重置陷阱

當(dāng)你改變了收到信號后采取的動作,你可以省略第一個參數(shù)來重置到默認行為。

 $ trap 1 2

注意

  1. trap -l 等價于執(zhí)行 kill -l。

  2. 發(fā)送信號請查看 kill 命令。

  3. 該命令是bash內(nèi)建命令,相關(guān)的幫助信息請查看 help 命令。

關(guān)于“Linux中trap命令怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI