【问题标题】:Tailing log until certain time threshold is reached拖尾日志,直到达到特定时间阈值
【发布时间】:2011-05-30 10:10:06
【问题描述】:

我正在跟踪这样的日志:

while [[ ! -n "${ready}" ]]; do
    start_info=`grep "Ready" $LOG_FILE`
    sleep 10
done

如果日志文件中没有“Ready”,这会永远持续下去,我怎样才能让它运行 200 秒?就像某种时间阈值。

谢谢

【问题讨论】:

  • 你的意思是while [[ -z "${start_info}" ]]; do 吗?
  • @khachik 是的,我找到了您的示例并进行了修改
  • 这里的主要问题是您每次都“grep”整个文件。如果日志文件很大,您可能会遇到性能问题。
  • @Yuval 你还有什么推荐的?
  • 尾 -F $LOG_FILE | grep "Ready" > tmp.file,然后在 tmp 文件上运行你的脚本

标签: linux shell ksh sh


【解决方案1】:

这样可以避免重复 grepping 整个文件:

start=$SECONDS
limit=200
while read -r line
do
    if [[ $line =~ $ready ]]
    then
        start_info=$line
        break
    fi
    if (( $SECONDS >= start + limit ))
    then
        break
    fi
done < "$LOG_FILE"

【讨论】:

  • 我认为这个答案比我的要好。 +1
  • 但是如果你不 grep 整个文件,如果在 grep 行时你的方式 pass server 已经启动了怎么办?
  • @London:while read 循环从文件的开头开始并读取每一行。我的回答的问题是它不会保持文件打开,因此它会在到达文件末尾时立即结束,而无需等待添加额外的行。我认为基于 Yuval 关于tail -f 的评论会更好。浏览these questions,看看你是否找到了有用的东西。
【解决方案2】:

如果我的问题正确(while [[ ! -n "${ready}" ]]; do 令人困惑)这里是一个如何检查时间阈值的示例:

#!/bin/sh

...
timelimit=200
pausetime=10

while [[ -z "${start_info}" ]]; do
  start_info=`grep "Ready" $LOG_FILE`
  sleep $pausetime
  timelimit=$((timelimit - $pausetime))
  if [ $timelimit -le 0 ]; then
    break
  fi  
done

【讨论】:

  • 为了保持一致性,你为什么不在两个地方都使用[[]](或者在第二个地方使用(( timelimit &lt;= 0 )))和$()而不是反引号?您也可以使用(( timelimit -= pausetime ))(请注意,您有一个拼写错误,上面写着“limit =”,应该写成“timelimit =”)。不必在双括号中的变量上引用和使用花括号,您可以使用[[ -z $start_info ]]。就像穿着腰带和吊带裤一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多