我需要做以下事情才能确保我的应用服务器
有没有办法在while循环中包含超时?
答案 0 :(得分:10)
#!/bin/bash
tail -f logfile | grep 'certain_word' | read -t 1200 dummy_var
[ $? -eq 0 ] && echo 'ok' || echo 'server not up'
这会读取写入日志文件的任何内容,搜索certain_word,如果一切正常则回显,如果等待1200秒(20分钟),它会抱怨。
答案 1 :(得分:1)
你可以这样做:
start_time=$(date +"%s")
while true
do
elapsed_time=$(($(date +"%s") - $start_time))
if [[ "$elapsed_time" -gt 1200 ]]; then
break
fi
sleep 1
if [[ $(grep -c "specific string" /path/to/log/file.log) -ge 1 ]]; then
break
fi
done
答案 2 :(得分:0)
您可以使用shell脚本中的信号处理程序(请参阅http://www.ibm.com/developerworks/aix/library/au-usingtraps/index.html)。
基本上,您要定义一个要调用的函数,比如信号17,然后在后台放置一个子脚本,以便稍后发送该信号:
timeout(pid) {
sleep 1200
kill -SIGUSR1 $pid
}
watch_for_input() {
tail -f file | grep item
}
trap 'echo "Not found"; exit' SIGUSR1
timeout($$) &
watch_for_input
然后,如果你达到1200秒,你的功能就会被调用,你可以选择做什么(比如发出正在观察你的模式的尾巴/ grep组合的信号以便杀死它)
答案 3 :(得分:0)
time=0
found=0
while [ $time -lt 1200 ]; do
out=$(tail logfile)
if [[ $out =~ specificString ]]; then
found=1
break;
fi
let time++
sleep 1
done
echo $found
答案 4 :(得分:0)
接受的答案不起作用且永远不会退出(因为[{1}}退出,因此先前的管道命令(read -t
)只会在tail -f | grep
退出时收到通知尝试写入输出,直到字符串匹配才会发生。
单行可能是可行的,但这里是脚本(工作)方法。
每个逻辑都是相同的,它们使用read -t
在超时后终止当前脚本。
Perl可能比kill
gawk/read -t