2016-12-23 6 views
4

의 출력을 프로그램을 실행 중일 때 error_log이라는 파일로 리디렉션하려고합니다. myprogram.sh 실행 지속적으로 데이터를 생성하고 지금은 시간 당이 파일을 회전 logrotate을 사용하고 /var/log/httpd/error_log프로그램 출력을 회전 파일로 리디렉션

  • myprogram.sh >> /var/log/httpd/error_log

에 쓰는 경우

명령 나는이 같은 모습을 사용하고 있습니다. logrotatecreate 명령을 사용하여 원래 파일의 이름을 바꾸고 새 파일을 만듭니다. logrotate 설정 여기

/var/log/httpd/error_log { 
# copytruncate 
create 
rotate 4 
dateext 
missingok 
ifempty 
. 
. 
. 
} 

처럼 보이지만 리디렉션이 실패합니다. 내가 원하는 myprogram.sh가 새로 생성 된 error_log 파일에 분명히, 그것은 logrotate에 의해 회전에 관계없이 error_log 파일에 데이터를 작성하는 것입니다

만드는 방법 어떤 생각 파일 이름하지설명에 따라 재 작업?

또는

bash는 그것을하는 다른 방법은? 나는 (myprogram.sh을 수정없이) 문제, 하나 개의 솔루션을 이해하면

+0

나는이 문제를 이해하지 못한다.출력 리디렉션을 수행 할 때 설명 자이 아니라 파일 이름이 사용됩니다. 스크립트를 보여줄 수 있습니까? – Barmar

+0

예, 사용했을 때'logrotate' 명령 전체를 보여줄 수 있습니까? –

+0

왜 copytruncate를 사용하지 않으므로 myprogram.sh는 이전 로그 파일에 (appending)을 계속 쓸 수 있습니다. create (mv와 비슷하다)에 문제가 없을 것이다. –

답변

2

가 될 수있다 :

$ myprogram.sh | while true; do head -10 >> /var/log/httpd/error_log; done 

는 설명하기 :

  • myprogram.sh
  • 우리는 while 배쉬 문장이 출력을 리디렉션 stdout에 기록 파이프 | 통해.
  • 은 무한 루프로 끝나지 않으며 심지어 파이프를 끊어야하는 myprogram.sh의 끝 부분도 종료됩니다.
  • 각 루프에서 파이프에서 읽은 첫 번째 10 개의 행을 현재 /var/log/httpd/error_log 파일의 끝에 추가하도록 명령이 호출됩니다 (logrotate로 인해 마지막 루프와 다를 수 있음).

(당신은 라인의 수는 각 루프에 기록되는 변경할 수 있습니다) 그리고 또 다른 방법은 다음과 같습니다

첫 번째 매우 유사
$ myprogram.sh | while read line; do echo "$line" >> /var/log/httpd/error_log; done 
  • 만이이 종료 myprogram.sh이 끝나거나 닫히면 루프됩니다.
  • 줄 단위로 줄 단위로 작동합니다.