bash中trap的用法

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

概要
可能有這樣的情況,你不想讓使用你的腳本的用戶不合時宜地通過鍵盤來結束進程,比如因為必須提供輸入或者必須進行某些清理工作。 trap 語句捕獲到這些序列且能夠被編製出來在不活這些信號時候執行一系列的命令。

trap 語句的語法是這樣的:
trap [COMMANDS] [SIGNALS]
意味著 trap 命令會捕捉在 SIGNALS 列出的可能帶有或者沒有 SIG 前綴的信號,或者信號數字。如果一個信號是 0 或者 EXIT,那麼 COMMANDS 在shell退出時候執行。如果其中一個信號是 DEBUG,COMMANDS 列表在每個簡單命令後執行。一個信號也可以指定為 ERR;這樣的情況下 COMMANDS 在每次一個簡單命令以非零狀態退出時執行。注意這些命令不會在非零退出狀態來自一個 if 語句時執行,或者來自一個 while 或者 until 循環。如果一個邏輯 AND (&&) 或者 OR (||) 出現在非零退出狀態中,所有都不會執行,或者當一個命令的退出狀態使用 ! 操作符進行取反。
除非遭遇一個非法的信號,否則 trap 命令的返回狀態是0。trap 命令帶一組選項,在Bash的info頁面中有記錄。

這裡有個非常簡單的例子,從用戶處捕捉 Ctrl+C, upon which a message is printed. 當你嘗試著不指定 KILL 信號來殺掉這個程序時,什麼都不會發生:

#!/bin/bash
# traptest.sh

trap “echo Booh!" SIGINT SIGTERM
echo “pid is $$"

while : # This is the same as “while true".
do
sleep 60 # This script is not really doing anything.
done

Bash怎樣解釋陷阱
每當Bash收到一個預先設置等待命令完成的陷阱的信號,在命令結束之前,陷阱不會執行。當Bash通過內建的命令 wait 來等待一個異步的命令,陷阱已經發送的信號的接受會導致內建的 wait 立即在陷阱執行後返回一個大於128的推出狀態。
檢測一個已經使用的變量
每當調試較長的腳本的時候,你可能想給於一個變量 trace 屬性和陷阱的 DEBUG 信息。通常你會像這樣 VARIABLE=value來給變量賦值。用下面的幾行來代替變量的聲明可能會為你腳本的行為提供非常有價值的信息:
declare -t VARIABLE=value

trap “echo VARIABLE is being used here." DEBUG

# rest of the script
在退出的時候清理垃圾
whatis 命令依靠由cron執行 makewhatis.cron 生成的數據庫:
#!/bin/bash

LOCKFILE=/var/lock/makewhatis.lock

# Previous makewhatis should execute successfully:

[ -f $LOCKFILE ] && exit 0

# Upon exit, remove lockfile.

trap “{ rm -f $LOCKFILE ; exit 255; }" EXIT

touch $LOCKFILE

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s