TRAP 收到訊號後不立即執行的問題

2021-06-03 11:59:40 字數 1129 閱讀 6551

今天寫指令碼的時候遇到乙個

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 ...