쉘에서 리디렉션 로그 파일 내용을 지우는 방법은 무엇입니까?

쉘에서 리디렉션 로그 파일 내용을 지우는 방법은 무엇입니까?

리디렉션을 사용하여 println작업 출력을 xxx.log파일에 기록합니다. 하지만 로그 정보를 crontab을 통해 현재 날짜 이름을 가진 별도의 파일로 옮기고 싶습니다 2017-08-18.log.

> xxx.log쉘 명령을 사용하여 파일 지우기를 시도했지만 xxx.log새 로그가 생성되면 모든 것이 복원됩니다.

리디렉션 로그 파일을 지우는 방법은 무엇입니까?

고쳐 쓰다

  1. 실행한 후 > xxx.log파일 xxx.log크기는 0입니다. 그러나 내 응용 프로그램이 일부 새 로그를 인쇄하면 xxx.log새 로그 정보뿐만 아니라 이전에 지워진 로그 정보도 포함됩니다.
  2. 사용 후에는 mv xxx.log xxx2.log새로운 로그 정보가 기록됩니다 xxx2.log. 하지만 이름 바꾸기 대신 사용하면 rm xxx.log로그 작업이 중지됩니다. 또한 nohup java -jar xxx.jar > xxx.log 2>&1 &익숙하다면 다음과 같은 절차를 따르세요.게임 프레임워크, 파일 빌드를 실행하면 dist명령을 통해 jar 파일이 생성됩니다.
  3. ps wx|grep "xxx.*.log출력:
    1) 3912 pts/10 S+ 0:00 grep --color=auto xxx.log
    2) 26234 pts/10 Sl 0:16 /usr/lib/jvm/jdk1.8.0_111/bin/java -Duser.dir=...something ignored... play.core.server.ProdServerStart(프로세스 실행 명령입니다)

도움이 되었기를 바랍니다. 다시 한 번 감사드립니다!

답변1

문제는 로그 파일을 작성하는 응용 프로그램에 의해 로그 파일이 열려 있다는 것입니다. 파일( )을 자르면 > file.log응용 프로그램은 마지막으로 작성된 위치부터 계속해서 쓰기 시작합니다(잘림으로 인해 그 이전에는 파일이 0바이트로 채워질 것으로 가정합니다). 파일을 이동하면 파일이 열리면 이름이 더 이상 중요하지 않으므로 응용 프로그램은 계속해서 파일에 씁니다. 파일을 삭제하면 해당 블록은 디스크에서 해제되지 않으며 파일이 디렉터리에 더 이상 표시되지 않더라도 애플리케이션은 계속해서 블록에 기록합니다.

이것은 고전적인 장면입니다. 귀하의 신청서는 다음을 충족해야 합니다.

  • 주기적으로 로그 파일 다시 열기
  • 또는 잘린 것을 감지하고 다시 엽니다.
  • 또는 "현재 로그 파일을 닫고 다시 열라"는 특수 신호를 기다립니다.

그렇지 않으면 애플리케이션을 다시 시작하는 것 외에는 외부적으로 아무것도 할 수 없습니다. 그런 다음 아래와 같은 방식으로 진행합니다 logrotate.

  • 먼저 로그 파일을 새 이름으로 이동합니다.
  • 선택적으로 touch로그 파일의 이전 이름을 사용하여 파일이 존재하도록 합니다.
  • 이전 로그 파일 쓰기를 강제로 중지하고 새 로그 파일 쓰기를 시작하려면 애플리케이션을 다시 시작하세요.

답변2

Perl에 익숙하다면 다음 작은 스크립트를 실행할 수 있습니다.

use POSIX qw(strftime);

$fbase = "tmp-%Y-%m-%d-%H-%M.log";

while(<>)
{
  $fnamenew = strftime $fbase, localtime;

  if ($fnamenew ne $fname)
  {
    print "logging to: $fnamenew\n";
    $fname = $fnamenew;
    close OUT;
    open OUT, ">$fname";
  }
  print OUT $_;
}

다음과 같이 사용하십시오: $mycomputation | perl script.pl. 주어진 시간 패턴에 따라 작성된 파일 이름에 모든 입력을 추가합니다(여기서는 ) tmp-YYYY-MM-DD-HH-MI.log. 새로운 입력 줄마다 스키마가 다시 작성되고 이전 스키마와 비교하여 확인됩니다. 다른 경우 입력이 새 파일로 파이프되고 이전 파일은 닫힙니다.

관련 정보