成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在腳本中使用Bash信號捕獲

系統 Linux
Shell腳本的啟動并不難被檢測到,但Shell腳本的終止檢測卻并不容易,因為我們無法確定腳本會按照預期地正常結束,還是由于意外的錯誤導致失敗。當腳本執行失敗時,將正在處理的內容記錄下來是非常有用的做法,但有時候這樣做起來并不方便。無論你的腳本是否成功運行,信號捕獲trap都能讓它平穩...

[[346064]]

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

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

響應失敗

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

  1. #!/usr/bin/env bash
  2. CWD=`pwd`
  3. TMP=${TMP:-/tmp/tmpdir}
  4.  
  5. ## create tmp dir
  6. mkdir "${TMP}"
  7.  
  8. ## extract files to tmp
  9. tar xf "${1}" --directory "${TMP}"
  10.  
  11. ## move to tmpdir and run commands
  12. pushd "${TMP}"
  13. for IMG in *.jpg; do
  14. mogrify -verbose -flip -flop "${IMG}"
  15. done
  16. tar --create --file "${1%.*}".tar *.jpg
  17.  
  18. ## move back to origin
  19. popd
  20.  
  21. ## bundle with bzip2
  22. bzip2 --compress "${TMP}"/"${1%.*}".tar \
  23. --stdout > "${1%.*}".tbz
  24.  
  25. ## clean up
  26. /usr/bin/rm -r /tmp/tmpdir

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

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

使用 trap 捕獲信號

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

  1. $ trap --list
  2.  1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
  3.  6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
  4. 11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
  5. 16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
  6. 21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
  7. 26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
  8. 31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
  9. 38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
  10. 43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
  11. 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
  12. 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
  13. 58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
  14. 63) SIGRTMAX-1  64) SIGRTMAX

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

  • EXIT:進程退出時發出的信號
  • ERR:進程以非 0 狀態碼退出時發出的信號
  • DEBUG:表示調試模式的布爾值

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

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

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

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

  1. #!/usr/bin/env bash
  2. CWD=`pwd`
  3. TMP=${TMP:-/tmp/tmpdir}
  4.  
  5. trap \
  6. "{ /usr/bin/rm -r "${TMP}" ; exit 255; }" \
  7. SIGINT SIGTERM ERR EXIT
  8.  
  9. ## create tmp dir
  10. mkdir "${TMP}"
  11. tar xf "${1}" --directory "${TMP}"
  12.  
  13. ## move to tmp and run commands
  14. pushd "${TMP}"
  15. for IMG in *.jpg; do
  16. mogrify -verbose -flip -flop "${IMG}"
  17. done
  18. tar --create --file "${1%.*}".tar *.jpg
  19.  
  20. ## move back to origin
  21. popd
  22.  
  23. ## zip tar
  24. bzip2 --compress $TMP/"${1%.*}".tar \
  25. --stdout > "${1%.*}".tbz

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

Bash 中的信號捕獲

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

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2022-11-23 08:14:42

bash 腳本test 命令

2019-04-22 14:39:05

BashLinux命令

2019-04-15 11:10:34

Bash方括號命令行

2023-07-12 14:13:03

BashLinux

2022-12-14 10:08:00

BashLinux

2022-01-16 07:48:33

腳本Bash 工具

2022-12-02 14:30:24

Bash腳本數組

2023-07-20 15:37:50

Bash數組

2023-01-13 12:37:43

Bashshell花括號

2019-10-22 17:33:57

LinuxBash腳本

2022-03-30 09:32:32

BashtestLinux

2023-03-14 08:17:40

Bash編程語言

2020-04-09 10:18:51

Bash循環Linux

2011-09-07 09:51:27

Javascript

2010-07-01 09:29:15

Java腳本語言javax.scrip

2018-12-14 10:00:16

BashLinux命令

2019-08-01 09:35:09

LinuxBashmessages

2021-05-11 07:50:31

BashShell腳本

2013-12-13 17:21:14

Lua腳本語言

2023-11-17 12:04:39

GORM并發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费成人午夜 | 人人色视频 | 日本福利视频免费观看 | 国产欧美精品区一区二区三区 | 日本一级淫片免费啪啪3 | 国产黄色精品 | 福利视频大全 | 亚洲欧美综合 | www.成人.com| 91免费电影| 男女羞羞视频在线观看 | 999视频 | 久久国产精品久久久久久 | 国产精品爱久久久久久久 | 久久99精品视频 | 久久久高清 | 视频一区二区三区中文字幕 | 国产一区成人 | 青草久久免费视频 | 日本在线小视频 | 免费av在线 | 欧美精品乱码久久久久久按摩 | 日韩精品一区二区三区中文在线 | 第一福利社区1024 | ww亚洲ww亚在线观看 | 日韩中文字幕一区 | 国产精品美女久久久久aⅴ国产馆 | yiren22 亚洲综合 | 欧美午夜在线 | 天堂av资源 | 国产成人在线观看免费 | 国产亚洲一区二区三区在线观看 | 日本精品久久 | 热re99久久精品国产99热 | 亚洲精品4| 日韩二区| 亚洲精品观看 | 日韩精品四区 | 午夜播放器在线观看 | 精品视频在线一区 | 国产精品久久久久久久久久 |