![对 bash 超时执行特殊操作](https://linux22.com/image/162658/%E5%AF%B9%20bash%20%E8%B6%85%E6%97%B6%E6%89%A7%E8%A1%8C%E7%89%B9%E6%AE%8A%E6%93%8D%E4%BD%9C.png)
bash
这个问题仅与,没有ssh
或任何其他工具有关。
我想检测bash
超时,并且只有超时:我是不是对任何其他退出条件感兴趣(exit
、EOF
、^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