2011-04-13 22 views
12

我在運行子/後臺進程時無法捕獲信號。子女後臺進程中的陷阱信號

這裏是我的簡單的bash腳本:

#!/bin/bash 

echo "in child" 

trap "got_signal" SIGINT 

function got_signal { 
    echo "trapped" 
    exit 0 
} 

while [ true ]; do 
    sleep 2 
done 

當運行這個後來做

kill -SIGINT (pid) 

一切正常,它打印 '被困',然後退出。

現在,如果我這樣從父腳本來啓動同一個腳本:

#!/bin/bash 

echo "starting the child" 

./child.sh & 

那麼孩子不捕獲信號了......?

更改爲使用SIGTERM而不是SIGINT後,它似乎工作正常......?

回答

10

bash手冊頁上OSX(但應在其他版本一樣)有這樣說的信號處理:

通過 bash運行

非內置命令必須設置爲繼承的值 信號處理程序由它的父母的殼。當作業控制不在 效果中時,異步命令除 之外還忽略SIGINTSIGQUIT這些繼承的處理程序。

並進一步,在trap命令下:

信號在進入忽略,以不能 被捕獲或重置殼。

由於腳本默認不使用作業控制,這意味着您正在談論的情況。