今天寫指令碼的時候遇到乙個
trap
不會立即觸發的問題。
**********==
bbb.sh*****=
#!/bin/bash
# traptest.sh
trap "echobooh!;exit 0" term
trap "echo booh!;exit 0"
int
echo "pid is$$"
sleep 600
***************
執行指令碼,執行
echo
後進入睡眠。此時用
ps -xj
看bbb.sh
和sleep 600
在同乙個程序組
tpgid。
重新登入乙個登入
shell
,向該bbb.sh
傳送int
新號:kill -int pid
或者傳送
kill -term pid,
這時bbb.sh
會捕捉到這個新號,但是不會立即執行
trap
表中的程式
(echo booh!;exit 0
),而是等到
sleep 600
這個子程序結束之後才會執行echo booh!;exit 0。
經初步驗證,除了不能**捉的兩個新號-9
和-19
訊號外,
每當bash收到乙個預先設定等待命令完成的陷阱的訊號,在
所有的子程序或者子
shell
退出之前,
trap
設定的命令不會被執行到。
還有另外,當執行
bbb.sh
在終端執行時,按
ctrl+ctrap
會立即觸發,
bbb.sh
結束。
最終的原因是:
ctrl+c
會向當前前台程序組所有程序
(子程序和父程序
)都傳送乙個
int新號。
sleep 600
在收到int
新號之後退出,這是
bbb.sh
捕捉到的
int訊號就會觸發了。
trap命令 在指令碼中處理訊號
trap是乙個shell內建命令,用於指定在接收到訊號後將要採取的動作,常見的用途是在指令碼程式被中斷時完成清理工作。比如,按ctrl c會使指令碼終止執行,實際上系統傳送了sigint訊號給指令碼程序,sigint訊號的預設處理方式就是退出程式。如果要在ctrl c不退出程式,那麼就得使用trap...
訊號捕獲trap及其例項應用
編號 訊號名稱 預設動作 描述sighup 終止終止程序,掛起 sigint 終止鍵盤輸入中斷命令,一般是ctrl c sigquit coredump 鍵盤輸入退出命令,一般是ctrl sigill coredump 非法指令 sigtrap coredump trap指令發出,一般除錯用 sig...
linux下採用trap對訊號進行捕捉
在linux中,trap命令主要用於接收訊號並採取行動,訊號是非同步傳送到乙個程式的事件,在預設情況下,可以終止乙個程式,trap命令原型如下 trap command signal signal是指接收到的訊號,command是接收到該訊號採取的行動。如下為兩種簡單的訊號。訊號 說明 int 2 ...