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

사용할 필요가 없거나 nohup포그라운드 프로세스로 실행하기만 하면 됩니다. ps어떤 이유로든 종료되면 상위 셸 프로세스도 종료되어 다시 시작 명령이 쓸모 없게 됩니다. 더 나은 접근 방식은 이 이상한 목적을 위한 서비스를 만드는 것입니다.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시간 후에도 계속 실행 중인 경우 스크립트를 종료하는 백그라운드 절전 모드를 대신 사용할 수 있습니다 .

관련 정보