偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

在腳本中使用Bash信號(hào)捕獲

系統(tǒng) Linux
Shell腳本的啟動(dòng)并不難被檢測(cè)到,但Shell腳本的終止檢測(cè)卻并不容易,因?yàn)槲覀儫o(wú)法確定腳本會(huì)按照預(yù)期地正常結(jié)束,還是由于意外的錯(cuò)誤導(dǎo)致失敗。當(dāng)腳本執(zhí)行失敗時(shí),將正在處理的內(nèi)容記錄下來(lái)是非常有用的做法,但有時(shí)候這樣做起來(lái)并不方便。無(wú)論你的腳本是否成功運(yùn)行,信號(hào)捕獲trap都能讓它平穩(wěn)...

[[346064]]

無(wú)論你的腳本是否成功運(yùn)行,信號(hào)捕獲trap都能讓它平穩(wěn)結(jié)束。

Shell 腳本的啟動(dòng)并不難被檢測(cè)到,但 Shell 腳本的終止檢測(cè)卻并不容易,因?yàn)槲覀儫o(wú)法確定腳本會(huì)按照預(yù)期地正常結(jié)束,還是由于意外的錯(cuò)誤導(dǎo)致失敗。當(dāng)腳本執(zhí)行失敗時(shí),將正在處理的內(nèi)容記錄下來(lái)是非常有用的做法,但有時(shí)候這樣做起來(lái)并不方便。而 Bash 中 trap 命令的存在正是為了解決這個(gè)問(wèn)題,它可以捕獲到腳本的終止信號(hào),并以某種預(yù)設(shè)的方式作出應(yīng)對(duì)。

響應(yīng)失敗

如果出現(xiàn)了一個(gè)錯(cuò)誤,可能導(dǎo)致發(fā)生一連串錯(cuò)誤。下面示例腳本中,首先在 /tmp 中創(chuàng)建一個(gè)臨時(shí)目錄,這樣可以在臨時(shí)目錄中執(zhí)行解包、文件處理等操作,然后再以另一種壓縮格式進(jìn)行打包:

  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

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

其中一個(gè)解決方案是在腳本開(kāi)頭增加一個(gè)預(yù)防性刪除邏輯用來(lái)處理這種情況。但這種做法顯得有些暴力,而我們更應(yīng)該從結(jié)構(gòu)上解決這個(gè)問(wèn)題。使用 trap 是一個(gè)優(yōu)雅的方法。

使用 trap 捕獲信號(hào)

我們可以通過(guò) trap 捕捉程序運(yùn)行時(shí)的信號(hào)。如果你使用過(guò) kill 或者 killall 命令,那你就已經(jīng)使用過(guò)名為 SIGTERM 的信號(hào)了。除此以外,還可以執(zhí)行 trap -l 或 trap --list 命令列出其它更多的信號(hào):

  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 識(shí)別的信號(hào)除了以上這些,還包括:

  • EXIT:進(jìn)程退出時(shí)發(fā)出的信號(hào)
  • ERR:進(jìn)程以非 0 狀態(tài)碼退出時(shí)發(fā)出的信號(hào)
  • DEBUG:表示調(diào)試模式的布爾值

如果要在 Bash 中實(shí)現(xiàn)信號(hào)捕獲,只需要在 trap 后加上需要執(zhí)行的命令,再加上需要捕獲的信號(hào)列表就可以了。

例如,下面的這行語(yǔ)句可以捕獲到在進(jìn)程運(yùn)行時(shí)用戶按下 Ctrl + C 組合鍵發(fā)出的 SIGINT 信號(hào):

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

因此,上文中腳本的缺陷可以通過(guò)使用 trap 捕獲 SIGINTSIGTERM、進(jìn)程錯(cuò)誤退出、進(jìn)程正常退出等信號(hào),并正確處理臨時(shí)目錄的方式來(lái)修復(fù):

  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

對(duì)于更復(fù)雜的功能,還可以用 Bash 函數(shù)來(lái)簡(jiǎn)化 trap 語(yǔ)句。

Bash 中的信號(hào)捕獲

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

 

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2022-11-23 08:14:42

bash 腳本test 命令

2019-04-15 11:10:34

Bash方括號(hào)命令行

2019-04-22 14:39:05

BashLinux命令

2022-12-02 14:30:24

Bash腳本數(shù)組

2023-07-20 15:37:50

Bash數(shù)組

2023-01-13 12:37:43

Bashshell花括號(hào)

2023-07-12 14:13:03

BashLinux

2022-12-14 10:08:00

BashLinux

2022-01-16 07:48:33

腳本Bash 工具

2019-10-22 17:33:57

LinuxBash腳本

2022-03-30 09:32:32

BashtestLinux

2023-03-14 08:17:40

Bash編程語(yǔ)言

2020-04-09 10:18:51

Bash循環(huán)Linux

2011-09-07 09:51:27

Javascript

2010-07-01 09:29:15

Java腳本語(yǔ)言javax.scrip

2018-12-14 10:00:16

BashLinux命令

2019-08-01 09:35:09

LinuxBashmessages

2021-05-11 07:50:31

BashShell腳本

2023-08-23 12:12:45

BashLinux

2013-12-13 17:21:14

Lua腳本語(yǔ)言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)