當前位置:
首頁 > 知識 > 在腳本中使用 Bash 信號捕獲|Linux 中國

在腳本中使用 Bash 信號捕獲|Linux 中國

導讀:無論你的腳本是否成功運行,信號捕獲(trap)都能讓它平穩結束。                     

本文字數:3879,閱讀時長大約:4分鐘

https://linux.cn/article-12715-1.html

作者:Seth Kenlon

譯者:Hank Chow

無論你的腳本是否成功運行,信號捕獲(trap)都能讓它平穩結束。

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

響應失敗

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

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

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

使用 trap 捕獲信號

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

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

??:進程退出時發出的信號

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

??:表示調試模式的布爾值

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

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

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

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

Bash 中的信號捕獲

信號捕獲可以讓腳本在無論是否成功執行所有任務的情況下都能夠正確完成清理工作,能讓你的腳本更加可靠,這是一個很好的習慣。儘管嘗試把信號捕獲加入到你的腳本里看看能夠起到什麼作用吧。

via:https://opensource.com/article/20/6/bash-trap

作者:Seth Kenlon選題:lujun9972譯者:HankChow校對:wxy

本文由LCTT原創編譯,Linux中國榮譽推出

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!


請您繼續閱讀更多來自 Linux中國 的精彩文章:

新聞拍一拍#IonQ 宣稱打造了迄今最強大的量子計算機
MS Excel 數據文件超過最大大小導致英國近 1.6 萬例 Covid-19 未被報告