为什么空值会有纪元时间?
Why there is an epoch time from empty value?
我正在尝试改进读取日志文件并在应用程序已停止 运行 和日志记录时发送通知的监视器。为了避免在日志文件轮换且应用程序未记录任何内容时收到通知,我添加了一个检查以查看最旧的日志行是否超过两分钟。
这是重要部分的片段。
<bash lines and variable setting>
LATEST=$(gawk 'match([=10=], /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*<AppToMonitor>/, m) {print m[1], m[2];} ' $LOG_TO_MONITOR | tail -1 )
OLDEST=$(gawk 'match([=10=], /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*INFO/, m) {print m[1], m[2];} ' $LOG_TO_MONITOR | head -1)
if [ -z "$LATEST" ]
then
# no line in log
OLDEST_EPOCH=`(date --date="$OLDEST" +%s)`
CURR_MINUS_TWO=$(date +"%Y-%m-%d %T" -d "2 mins ago")
CURR_MINUS_TWO_EPOCH=`(date --date="$CURR_MINUS_TWO" +%s)`
# If oldest log line is over two minutes old
if [[ "$OLDEST_EPOCH" -lt "$CURR_MINUS_TWO_EPOCH" ]]
then
log "No lines found."
<send notification>
else
log "Server.log rotated."
fi
<else and stuff>
日志轮换时我仍然收到一些通知,罪魁祸首是纪元时间是从完全空的日志文件中获取的。我通过使用 touch test.log
创建空的 .log 文件进行测试,然后设置 EMPTY=$(gawk 'match([=12=], /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*INFO/, m) {print m[1], m[2];} ' /home/USER/test.log | head -1)
现在,如果我 echo $EMPTY
,我得到一个空行。但是,如果我将此空行转换为纪元时间 EPOCHEMPTY=`(date --date="$EMPTY" +%s)`
,我会从 echo 中获得一个纪元时间 1584914400。这是指昨天晚上。显然,每次将空日期转换为纪元时间时都会出现相同的纪元,例如将“$EMPTY”替换为“”,至少在写这篇文章时是这样。
所以问题是,这个从空行算起的纪元时间是多少? 当 if 语句与这个值进行比较时,它会触发通知,即使它不应该触发通知。有没有一种方法可以避免将空字符串用于比较,而是从日志文件中获取其他时间值?
date
的手册定义传递给 -d
的空字符串将被视为一天的开始。
但是您可以依赖 -f
/--file
选项和进程替换:
date -f <(echo -n "$your_date")
-f
选项允许您将文件作为参数传递,其中的每一行都将被视为 -d
的输入。一个空文件只会 return 一个空输出。
进程替换用于即时创建一个临时文件(准确地说是一个匿名管道,但它仍然是一个文件),它只包含你的变量的内容,如果变量未定义或为空字符串,否则为单行。
我正在尝试改进读取日志文件并在应用程序已停止 运行 和日志记录时发送通知的监视器。为了避免在日志文件轮换且应用程序未记录任何内容时收到通知,我添加了一个检查以查看最旧的日志行是否超过两分钟。
这是重要部分的片段。
<bash lines and variable setting>
LATEST=$(gawk 'match([=10=], /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*<AppToMonitor>/, m) {print m[1], m[2];} ' $LOG_TO_MONITOR | tail -1 )
OLDEST=$(gawk 'match([=10=], /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*INFO/, m) {print m[1], m[2];} ' $LOG_TO_MONITOR | head -1)
if [ -z "$LATEST" ]
then
# no line in log
OLDEST_EPOCH=`(date --date="$OLDEST" +%s)`
CURR_MINUS_TWO=$(date +"%Y-%m-%d %T" -d "2 mins ago")
CURR_MINUS_TWO_EPOCH=`(date --date="$CURR_MINUS_TWO" +%s)`
# If oldest log line is over two minutes old
if [[ "$OLDEST_EPOCH" -lt "$CURR_MINUS_TWO_EPOCH" ]]
then
log "No lines found."
<send notification>
else
log "Server.log rotated."
fi
<else and stuff>
日志轮换时我仍然收到一些通知,罪魁祸首是纪元时间是从完全空的日志文件中获取的。我通过使用 touch test.log
创建空的 .log 文件进行测试,然后设置 EMPTY=$(gawk 'match([=12=], /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*INFO/, m) {print m[1], m[2];} ' /home/USER/test.log | head -1)
现在,如果我 echo $EMPTY
,我得到一个空行。但是,如果我将此空行转换为纪元时间 EPOCHEMPTY=`(date --date="$EMPTY" +%s)`
,我会从 echo 中获得一个纪元时间 1584914400。这是指昨天晚上。显然,每次将空日期转换为纪元时间时都会出现相同的纪元,例如将“$EMPTY”替换为“”,至少在写这篇文章时是这样。
所以问题是,这个从空行算起的纪元时间是多少? 当 if 语句与这个值进行比较时,它会触发通知,即使它不应该触发通知。有没有一种方法可以避免将空字符串用于比较,而是从日志文件中获取其他时间值?
date
的手册定义传递给 -d
的空字符串将被视为一天的开始。
但是您可以依赖 -f
/--file
选项和进程替换:
date -f <(echo -n "$your_date")
-f
选项允许您将文件作为参数传递,其中的每一行都将被视为 -d
的输入。一个空文件只会 return 一个空输出。
进程替换用于即时创建一个临时文件(准确地说是一个匿名管道,但它仍然是一个文件),它只包含你的变量的内容,如果变量未定义或为空字符串,否则为单行。