对 bash 超时执行特殊操作

对 bash 超时执行特殊操作

bash这个问题仅与,没有ssh或任何其他工具有关。

我想检测bash超时,并且只有超时:我是不是对任何其他退出条件感兴趣(exitEOF^D或通过任何信号终止)

如果设置超时变量:

$ TMOUT=10

当超时时,会显示以下内容:

$ timed out waiting for input: auto-logout

这是bash单独放置的,如实现中所示这里

但除了该控制台消息之外,我还没有找到任何方法来检测是否发生超时。我尝试过以下代码:

export TMOUT=10

function handle-termination {
    local retvalue=$1
    echo "retvalue=$retvalue"
    env > /tmp/env
    if [ "$retvalue" = "$(kill -l ALRM)" ] ; then
        echo "Timeout"
    else
        echo "Exit"
    fi
}

trap 'handle-termination $?' EXIT

希望$?超时的返回代码能够提供指示,但0无论是超时还是手动退出触发EXIT信号,它总是如此。

有什么方法可以可靠地检测bash会话超时吗?

答案1

您可以将“超时计数器”写入函数中,如果它先完成,它将终止脚本,否则函数本身将被终止。

run_tout_counter() {
    sleep 10 & wait
    echo timeout
    rm /tmp/toutPID
    kill -s SIGINT $processPID
}
export processPID=$$
run_tout_counter &  echo $! > /tmp/toutPID

read -p "type input:" A &&  ps $(cat /tmp/toutPID)  >/dev/null

excode=$?
if [[ $excode == 0 ]] ; then kill -s SIGINT $(cat /tmp/toutPID)  ; fi && rm /tmp/toutPID

相关内容