我正在尝试在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
答案 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
完成的框架。