검색했는데 아무것도 찾을 수 없었습니다. logrotate
현재 열려 있는 파일을 터치 하고 싶지 않습니다 . 뭔가를 하려고 하는데 lsof
스크립트에서 작업을 중단하도록 하는 방법을 찾지 못했습니다. 어떤 아이디어가 있나요?
답변1
nosharedscripts
이 설정(기본값)이 있고 prerotate
스크립트가 오류와 함께 종료되면 영향을 받는 로그 파일*에 대해 추가 조치가 수행되지 않습니다.
따라서 이론적으로 다음과 같은 결과를 얻을 수 있습니다(경고, 테스트되지 않음).
/var/log/application.log {
nosharedscripts
prerotate
logfile=$1
lsof $logfile >/dev/null
exit $?
endscript
...
}
따라서 열려 있는 프로세스가 lsof
없으면 스크립트가 종료되고 로그 에 아무 작업도 수행되지 않습니다.$logfile
prerotate
1
logrotate
*에서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
...