陷阱:使您的bash腳本更健壯

瀏覽國家網絡時,我遇到了一個 有趣的文章 (我將其文字化地介紹到這裡,是因為對它進行了詳盡的解釋),其中的作者向我們展示瞭如何使用 陷阱.

使用陷阱使bash腳本更健壯

假設您有一個bash腳本,該腳本每天每六個小時運行一次,並且在某個時刻失敗,或者同一腳本同時運行兩次。 這兩種情況非常令人不舒服,因為它們需要糾正人為乾預或在某些時候無法解決,從而使系統處於不一致狀態。 解決此問題的方法之一就是使用陷阱。

陷阱是控制bash腳本輸出的一種簡單有效的方法。 讓我們回到相同的初始情況,如果腳本是手動停止的(例如,使用ctrl-c停止),則腳本會中斷並返回輸出信號

INT

如果結尾為

kill

那麼輸出將是

TERM.

所有可能的退出代碼都可以通過查看

kill -l

但是,最常用的是

INT,TERM,EXIT

例如,如果腳本包含以下內容的文件同步:

rsync

最明智的做法是依賴一個不允許腳本同時運行的鎖定文件:

LOCK =“ /var/run/rsync.lock”,如果[! -e $ LOCK]; 然後觸摸$ LOCK rsync -avz foo bar rm $ LOCK否則回顯“ rsync已在運行” fi

用普通西班牙語,上面的腳本檢查鎖定文件是否存在,如果不存在,則創建該鎖定文件,然後執行相應的命令,最後刪除該鎖定文件。 如果該文件存在,則腳本僅向用戶發送一條消息,表明該命令已在運行。

但是,當出現問題時,可能會發生未消除鎖定文件的情況,從而破壞了有害的影響。 解決方案非常簡單:

LOCK =“ /var/run/rsync.lock”,如果[! -e $ LOCK]; 然後捕獲“ rm -f $ LOCK;退出” INT TERM EXIT觸摸$ LOCK rsync -avz foo bar rm $ LOCK陷阱-INT TERM EXIT否則回顯“ rsync已經在運行” fi

該解決方案的特殊之處在於該命令被包含在陷阱中,以便在接收到信號時

INT,TERM,EXIT

腳本停止並清除鎖定文件。

值得一提的是,在上述腳本中,在驗證鎖定文件與創建鎖定文件之間可能存在競爭情況。 一種可能的解決方案是使用重定向和bash的noclobber模式,該模式不重定向到現有文件:

LOCK =“ / var / run / rsync.lock” if(set -o noclobber; echo $$>“ $ LOCK”)2> / dev / null; 然後捕獲'rm -f“ $ LOCK”; 退出$? INT TERM EXIT rsync -avz foo bar rm -f $ LOCK陷阱-INT TERM EXIT else echo“ rsync已經在運行:$(cat $ LCK)” fi

後者的特殊之處在於它使用了noblobber模式,就像我已經說過的那樣,並且鎖定文件包含正在執行的進程的PID。

還值得一提的是,還有其他解決方案,例如

flock

o

solo

但是在這篇文章中,我想與bash自己的資源分享解決方案。 您可以通過此了解更多有關陷阱的信息 優秀的嚮導.


發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責數據:MiguelÁngelGatón
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   拉斐爾·卡斯特羅(Rafael Castro) 他說:

    大! 感謝分享。

  2.   nx 他說:

    不錯的文章,只需將“ echo“ rsync已經在運行:$(cat $ LCK)”“更改為” echo“ rsync已經在運行:$(cat $ LOCK)”“

    問候

  3.   德蘭戈斯 他說:

    先生,這是一篇非常有趣的文章! 這我保留。

  4.   華金 他說:

    請記住,這是一個非常有用的命令。 我在帖子中發布的腳本中使用了該腳本,以刪除該腳本在停止時創建的一些文件。

  5.   丹尼FP 他說:

    非常有趣,是的,先生。