日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

【Linux】一步一步学Linux——trap命令(229)

發(fā)布時(shí)間:2024/4/21 linux 69 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Linux】一步一步学Linux——trap命令(229) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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í)行,但是也有以下例外情況:

  • 如果執(zhí)行失敗的命令是緊跟在while或者until關(guān)鍵字之后的一組命令中的一部分時(shí)
  • 如果執(zhí)行失敗的命令是if測試語句的一部分時(shí),是 && 和 ||連接的列表中的一部分時(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):

    信號(hào)名稱信號(hào)數(shù)描述
    SIGHUP1本信號(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)用于通知它重新讀取配置文件。
    SIGINT2程序終止(interrupt)信號(hào), 在用戶鍵入INTR字符(通常是Ctrl C)時(shí)發(fā)出。
    SIGQUIT3和SIGINT類似, 但由QUIT字符(通常是Ctrl /)來控制. 進(jìn)程在因收到SIGQUIT退出時(shí)會(huì)產(chǎn)生core文件, 在這個(gè)意義上類似于一個(gè)程序錯(cuò)誤信號(hào)。
    SIGFPE8在發(fā)生致命的算術(shù)運(yùn)算錯(cuò)誤時(shí)發(fā)出. 不僅包括浮點(diǎn)運(yùn)算錯(cuò)誤, 還包括溢出及除數(shù)為0等其它所有的算術(shù)的錯(cuò)誤。
    SIGKILL9用來立即結(jié)束程序的運(yùn)行. 本信號(hào)不能被阻塞, 處理和忽略。
    SIGALRM14時(shí)鐘定時(shí)信號(hào), 計(jì)算的是實(shí)際的時(shí)間或時(shí)鐘時(shí)間. alarm函數(shù)使用該信號(hào)。
    SIGTERM15程序結(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腳本中的陷阱有三種常見的用途:

  • 清理臨時(shí)文件
  • 忽略信號(hào)
  • 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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。