2016-03-02 74 views
2

我想在後臺運行命令在shell腳本和wait爲他們在腳本的末尾,所以他們不會孤立。我也想在接收到信號時調用函數,但是信號會導致我的wait死機,並且腳本結束。我如何可以忽略信號wait並保留wait ing?例如:Bash有等待忽略信號

#!/bin/bash 

num=0 

sigHandle() 
{ 
    if [[ $num -eq 0 ]]; then 
     echo "trapped" 
     ((num++)) 
    else 
     echo "Already called trap" 
    fi 
} 

trap 'sigHandle' SIGUSR1 
sleep 12345 & 
wait 

我試圖改變我的陷阱是trap 'sigHandle; wait' SIGUSR1但後來我的信號處理功能沒有得到第一時間之後調用。這有效,但不知道這是否是正確的做法。

while :; do 
    wait 
done 

回答

3

在一個循環呼叫wait,並繼續如果wait退出時的狀態158(表示它是由SIGUSR1中斷):

sigusr1_no=30 # Mac OS X 
# sigusr1_no=10 # Linux 
trap 'sigHandle' SIGUSR1 
sleep 12345 & 
while :; do 
    wait 
    status=$? 
    if [[ $status = $((sigusr1_no + 128)) ]]; then 
     echo "USR1 handled, continuing" 
     continue 
    else 
     break 
    fi 
done 

一般而言,任何狀態大於128表示wait被中斷通過接收到的信號(該信號是狀態的低8位)。您可能想要以不同的方式處理不同的信號,但是這會給您一個決定是否繼續等待sleep完成的框架。

+0

SIGUSR1是nr 10,所以138,不是? – tomasz

+1

用於'SIGUSR1'的實際數字是平臺相關的。它在Linux中爲10,在Mac OS X中爲30。 – chepner

+0

有趣的是,tx。 – tomasz