尽管 tail 命令终止,仍将附加日志保留在单独的文件中

尽管 tail 命令终止,仍将附加日志保留在单独的文件中

我有 tomcat catalina.log 文件,该文件不断更新。

我希望catalina.log_new在接下来的 2 小时内将其过去 500 行 + 任何附加日志保留到新文件中。

首先我跑nohup tail -n 500 -F --retry catalina.log>>catalina.log_live

问题是上述tail命令可能会被终止(无论出于何种原因)。

我尝试了以下逻辑,但我不确定。我没有编写如何运行以下 2 小时的逻辑,因为它与问题无关。

nohup  tail -n 500 -F --retry catalina.log>>catalina.log_live

while true
do
    ps -ef | grep -v grep | grep tail | grep 500 | grep catalina.log
    if [ $? -ne 0 ]; then
        nohup  tail -n 1 -F --retry catalina.log>>catalina.log_live
    fi
  sleep 5;
done

您能否建议一下这种方法是否合适,不会导致丢失或重复的行,并帮助收集过去的 500 行以及从catalina.loginto开始的接下来 2 小时内出现的新行catalina.log_live

答案1

您不需要使用nohupor ,只需作为前台进程ps运行,如果由于某种原因终止,其父 shell 进程也会终止,从而使重新启动命令毫无用处。更好的方法是为这个奇怪的目的创建一个服务。tailtail

#!/bin/sh

# catalina_log_new.sh

{
    # sleep 2 hours, then kill parent process
    sleep $((2 * 60 * 60))
    kill $$
} &

# make sure alarm is killed when the script exits
_alarm_pid=$!
trap 'kill $_alarm_pid 2>/dev/null' EXIT

# first write last 500 lines
tail -n500 catalina.log > catalina.log_new

# then append new lines only
while true; do
    tail -F -n0 catalina.log >> catalina.log_new
done

或者您可以使用后台睡眠来代替后台睡眠timeout $((2 * 60 * 60)) ./catalina_log_new.sh,如果脚本在 2 小时后仍在运行,它将终止脚本。

相关内容