Shell函数用于在特定时间内为特定字符串尾随日志文件

时间:2012-12-21 02:39:58

标签: linux grep tail

我需要做以下事情才能确保我的应用服务器

  1. 为特定字符串设置日志文件
  2. 保持阻止,直到打印出该字符串
  3. 但是如果字符串没有打印大约20分钟退出并抛出异常消息,例如“服务器花费的时间超过20分钟”
  4. 如果在日志文件中打印了字符串,请退出循环并继续。
  5. 有没有办法在while循环中包含超时?

5 个答案:

答案 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