我有 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.log
into开始的接下来 2 小时内出现的新行catalina.log_live
?
答案1
您不需要使用nohup
or ,只需作为前台进程ps
运行,如果由于某种原因终止,其父 shell 进程也会终止,从而使重新启动命令毫无用处。更好的方法是为这个奇怪的目的创建一个服务。tail
tail
#!/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 小时后仍在运行,它将终止脚本。