내 응용 프로그램을 종료하지 않고 nohup.out 파일을 회전시키는 방법


10

nohup.out파일이 빠르게 커지고 있습니다.

백그라운드에서 응용 프로그램을 실행 중입니다. nohup.out파일을 작성 중입니다.

이제 nohup.out응용 프로그램을 종료하지 않고 파일 을 회전해야 합니다. 이것을 할 수 있습니까?


복사 한 다음 잘립니다.
Jenny D

그는 당신이 제안한이 두 작업 사이에 귀중한 로그 항목을 잃어 버릴 수 있습니다. 나는 그것을 추천하지 않을 것입니다.
Cleankod

답변:


6

flog를와 함께 보아야 logrotate합니다. 이것을 통해 응용 프로그램 출력을 파이프하면 SIGHUP실행중인 응용 프로그램을 종료하지 않고도 flog 프로세스를 수행 할 수 있습니다 .

flog (파일 로거)는 STDIN에서 입력을 읽고 파일에 쓰는 프로그램입니다.

SIGHUP이 수신되면 파일이 다시 열리고 로그 회전이 가능합니다 [RH의 logrotate (8) 참조].

로그 파일은 flog에서 회전이 발생했음을 감지 한 경우에만 다시 열립니다 (예 : 이전 파일이 없거나 inode가 변경됨). flog는 매우 작습니다 (500 바이트 미만의 메모리 풋 프린트).


nohup은 nohup.out 대신 파이프를 사용할 수 있습니까?
Brian Minton

1
매뉴얼 페이지에 따라 파일 리디렉션 (>)을 사용하여 nohup.out 이외의 파일로 출력 할 수 있습니다.To save output to FILE, use 'nohup COMMAND > FILE'
jas_raj

4

회전시킬 수 없습니다. 명령을 사용하여자를 수 있으며 >nohup.out파일의 모든 내용이 삭제됩니다.

출력을 저장해야하는 경우 파일을 먼저 복사 한 다음자를 수 있습니다. 그러나 레이스를위한 작은 창이 있는데, 파일을 복사 한 후 잘라 내기 전에 출력을 쓸 수 있습니다. 해당 기간 동안 작성된 모든 출력은 영구적으로 손실됩니다.


1
잘림은 파일 핸들이 닫힐 때까지 디스크의 공간을 비우지 않는다고 생각합니다.
symcbean

@symcbean 당신의 믿음이 틀립니다. 파일을 잘라 내면 공간이 즉시 확보됩니다.
kasperd

Logrotate copytruncate가 트릭을 수행해야합니다.
user9517

내가 설명하는 단계 @Iain 동등한 copytruncate에서 logrotate. 그러나 nohup.out크론 작업이 회전하도록 구성하는 파일은 거의 없습니다.
kasperd

2

당신은 할 수 없습니다.

파일 (rm)을 링크 해제 할 수 있지만 데이터는 여전히 디스크에 설치 공간을 가지고 있으며 열린 파일 핸들이있는 한 계속 기록됩니다.

파일 이름을 바꿀 수는 있지만 다시 파일 쓰기가 중지되지는 않습니다 (그러나 백그라운드 작업을 정기적으로 시작하는 경우 최신 작업이 동일한 파일에 작성 됨).

실제로 작업의 출력을 이것을 처리하도록 설계된 것으로 명시 적으로 리디렉션해야합니다 (예 : apache rotatelogs ).


logrotate copytruncate 누군가?
user9517

이는 nohup이 nohup.out을 라인 단위로 추가하는지 또는 nohup.out의 위치에 대한 포인터를 유지하는지 여부에 따라 다릅니다. 예제는 serverfault.com/questions/221337/… 을 참조하십시오 .
pepoluan

2

내가 너무 늦었는지 확실하지 않습니다. 그러나이 포럼을 우연히 발견 한 다른 사람들을 위해, 나는 flog 나 다른 것을 시도하지 않아도됩니다.

내 직업은 다음과 같이 간단하게 시작됩니다.

nohup <my process> &

이것은 내 작업을 시작하고 해당 디렉토리의 nohup.out에 추가하기 시작합니다.

내가해야 할 일은 일반적으로 배포판과 함께 제공되는 logrotate를 설정하고 다음과 같이 구성하는 것입니다. /etc/logrotate.conf

~/my abosolute path/nohup.out {
    size 1024k
    copytruncate
    rotate 100
    maxage 100
}

그리고 그것은 일했다!! 동일한 파일에서 새 추가를 가져 오는 동안 nohup.out이 잘 렸습니다. 프로세스도 죽지 않았습니다. 그리고 이와 같은 새로운 nohup.out nohup.out-20190528이 만들어졌습니다.

도움이 되었기를 바랍니다.


1

Logrotate에는 사용 가능한 copytruncate 옵션이 있습니다.이 옵션은 지정된 파일이 정상 회전 (설정된 경우 압축) 구성표에 복사 된 후 지정된 파일을 잘라냅니다 (비 웁니다).

   copytruncate
          Truncate  the  original log file in place after creating a copy,
          instead of moving the old log file and optionally creating a new
          one,  It  can be used when some program can not be told to close
          its logfile and thus might continue writing (appending)  to  the
          previous log file forever.  Note that there is a very small time
          slice between copying the file and truncating it, so  some  log-
          ging  data  might be lost.  When this option is used, the create
          option will have no effect, as the old log file stays in  place.

로부터 logrotate에 맨 .


1

다음과 같이 할 수 있습니다 :

cp nohup.out nohup.out.save # save it somewhere
echo "" > nohup.out

앱을 죽일 필요는 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.