91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

在腳本中如何使用Bash信號捕獲

發布時間:2021-10-23 14:39:28 來源:億速云 閱讀:148 作者:小新 欄目:系統運維

這篇文章將為大家詳細講解有關在腳本中如何使用Bash信號捕獲,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Shell 腳本的啟動并不難被檢測到,但 Shell 腳本的終止檢測卻并不容易,因為我們無法確定腳本會按照預期地正常結束,還是由于意外的錯誤導致失敗。當腳本執行失敗時,將正在處理的內容記錄下來是非常有用的做法,但有時候這樣做起來并不方便。而 Bash 中 trap 命令的存在正是為了解決這個問題,它可以捕獲到腳本的終止信號,并以某種預設的方式作出應對。

響應失敗

如果出現了一個錯誤,可能導致發生一連串錯誤。下面示例腳本中,首先在 /tmp 中創建一個臨時目錄,這樣可以在臨時目錄中執行解包、文件處理等操作,然后再以另一種壓縮格式進行打包:

#!/usr/bin/env bashCWD=`pwd`TMP=${TMP:-/tmp/tmpdir} ## create tmp dirmkdir "${TMP}" ## extract files to tmptar xf "${1}" --directory "${TMP}" ## move to tmpdir and run commandspushd "${TMP}"for IMG in *.jpg; do  mogrify -verbose -flip -flop "${IMG}"donetar --create --file "${1%.*}".tar *.jpg ## move back to originpopd ## bundle with bzip2bzip2 --compress "${TMP}"/"${1%.*}".tar \      --stdout > "${1%.*}".tbz ## clean up/usr/bin/rm -r /tmp/tmpdir

一般情況下,這個腳本都可以按照預期執行。但如果歸檔文件中的文件是 PNG 文件而不是期望的 JPEG  文件,腳本就會在中途失敗,這時候另一個問題就出現了:最后一步刪除臨時目錄的操作沒有被正常執行。如果你手動把臨時目錄刪掉,倒是不會造成什么影響,但是如果沒有手動把臨時目錄刪掉,在下一次執行這個腳本的時候,它必須處理一個現有的臨時目錄,里面充滿了不可預知的剩余文件。

其中一個解決方案是在腳本開頭增加一個預防性刪除邏輯用來處理這種情況。但這種做法顯得有些暴力,而我們更應該從結構上解決這個問題。使用 trap 是一個優雅的方法。

使用 trap 捕獲信號

我們可以通過 trap 捕捉程序運行時的信號。如果你使用過 kill 或者 killall 命令,那你就已經使用過名為 SIGTERM 的信號了。除此以外,還可以執行 trap -l 或 trap --list 命令列出其它更多的信號:

$ trap --list 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR111) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+338) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+843) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-758) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-263) SIGRTMAX-1  64) SIGRTMAX

可以被 trap 識別的信號除了以上這些,還包括:

  • EXIT:進程退出時發出的信號

  • ERR:進程以非 0 狀態碼退出時發出的信號

  • DEBUG:表示調試模式的布爾值

如果要在 Bash 中實現信號捕獲,只需要在 trap 后加上需要執行的命令,再加上需要捕獲的信號列表就可以了。

例如,下面的這行語句可以捕獲到在進程運行時用戶按下 Ctrl + C 組合鍵發出的 SIGINT 信號:

trap "{ echo 'Terminated with Ctrl+C'; }" SIGINT

因此,上文中腳本的缺陷可以通過使用 trap 捕獲 SIGINTSIGTERM、進程錯誤退出、進程正常退出等信號,并正確處理臨時目錄的方式來修復:

#!/usr/bin/env bashCWD=`pwd`TMP=${TMP:-/tmp/tmpdir} trap \ "{ /usr/bin/rm -r "${TMP}" ; exit 255; }" \ SIGINT SIGTERM ERR EXIT ## create tmp dirmkdir "${TMP}"tar xf "${1}" --directory "${TMP}" ## move to tmp and run commandspushd "${TMP}"for IMG in *.jpg; do  mogrify -verbose -flip -flop "${IMG}"donetar --create --file "${1%.*}".tar *.jpg ## move back to originpopd ## zip tarbzip2 --compress $TMP/"${1%.*}".tar \      --stdout > "${1%.*}".tbz

對于更復雜的功能,還可以用 Bash 函數來簡化 trap 語句。

關于“在腳本中如何使用Bash信號捕獲”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁蒗| 永修县| 富锦市| 炎陵县| 合山市| 万年县| 孟连| 定陶县| 五华县| 开化县| 麦盖提县| 新干县| 乌什县| 四子王旗| 湘潭县| 改则县| 乌拉特前旗| 黔西县| 东兰县| 金川县| 丹江口市| 乐至县| 南川市| 夏河县| 大渡口区| 通山县| 封丘县| 周宁县| 东乌珠穆沁旗| 邵阳县| 丹东市| 区。| 衡山县| 伊金霍洛旗| 昭平县| 交城县| 沐川县| 铁岭县| 宜宾市| 景宁| 定陶县|