Bash等待忽略信号

时间:2016-03-02 18:30:04

标签: bash signals

我正在尝试在shell脚本中在后台运行命令,并在脚本末尾为它们运行wait,这样它们就不会变成孤立的。我还想在收到信号时调用一个函数,但信号会杀死我的wait并且脚本结束。如何wait忽略信号并保持wait?例如:

#!/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 

1 个答案:

答案 0 :(得分: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完成的框架。