열린 파일을 무시하도록 logrotate에 지시하는 방법이 있습니까?

열린 파일을 무시하도록 logrotate에 지시하는 방법이 있습니까?

검색했는데 아무것도 찾을 수 없었습니다. logrotate현재 열려 있는 파일을 터치 하고 싶지 않습니다 . 뭔가를 하려고 하는데 lsof스크립트에서 작업을 중단하도록 하는 방법을 찾지 못했습니다. 어떤 아이디어가 있나요?

답변1

nosharedscripts이 설정(기본값)이 있고 prerotate스크립트가 오류와 함께 종료되면 영향을 받는 로그 파일*에 대해 추가 조치가 수행되지 않습니다.

따라서 이론적으로 다음과 같은 결과를 얻을 수 있습니다(경고, 테스트되지 않음).

/var/log/application.log {
    nosharedscripts
    prerotate
        logfile=$1
        lsof $logfile >/dev/null
        exit $?
    endscript
    ...
}

따라서 열려 있는 프로세스가 lsof없으면 스크립트가 종료되고 로그 에 아무 작업도 수행되지 않습니다.$logfileprerotate1logrotate


*에서logrotate(8)linux.die.net의 매뉴얼 페이지:

nosharedscripts
Run prerotate and postrotate scripts for every log file which is rotated
(this is the default, and overrides the sharedscripts option). The absolute
path to the log file is passed as first argument to the script. If the
scripts exit with error, the remaining actions will not be executed for the
affected log only.
...
prerotate/endscript
The lines between prerotate and endscript (both of which must appear on
lines by themselves) are executed (using /bin/sh) before the log file is
rotated and only if the log will actually be rotated. These directives may
only appear inside a log file definition. Normally, the absolute path to
the log file is passed as first argument to the script. If sharedscripts is
specified, whole pattern is passed to the script. See also postrotate. See
sharedscripts and nosharedscripts for error handling.

이것가능한버전 에 따라 다르지만 logrotate어떤 버전에서 이 작업을 수행하거나 수행하지 않는지에 대한 문서를 찾을 수 없습니다.

답변2

응용 프로그램이 파일을 이동하는 경우 다음과 같이 사용할 app.log수 있습니다 app.log.old.logrotate

/path/to/app/logs/*.old {
    missingok
    nocreate
    nocopytruncate
    nodelaycompress
    notifempty

     ... 
}

이는 logrotate애플리케이션이 완료한 파일만 처리하므로 열리지 않습니다.

답변3

다음과 같이 사용할 수 있습니다.

/path/*.log
{
  copytruncate
  missingok
  notifempty
...

관련 정보