Existe uma maneira de dizer ao logrotate para ignorar arquivos abertos?

4

Eu pesquisei um pouco e não consigo encontrar nada. Não quero que logrotate toque nos arquivos que estão abertos no momento. Eu estava pensando em fazer algo com lsof , mas não consegui fazer com que nenhum dos scripts abortasse uma operação. Alguma idéia?

    
por Aaron D. Marasco 05.10.2011 / 03:04

3 respostas

2

Se você tiver nosharedscripts set (o padrão) e o script prerotate sair com um erro, o arquivo de log afetado não terá mais nenhuma ação tomada *.

Então, em teoria, você poderia ter algo como (aviso, não testado):

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

assim, se lsof não encontrar nenhum processo com $logfile aberto, o script prerotate sairá com 1 e logrotate não realizará nenhuma ação nesse registro.

* Da página logrotate(8) man no 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.

Isso pode ser dependente da sua versão logrotate , mas não consigo encontrar nenhuma documentação sobre quais versões não se comportam desta maneira.

    
por 04.02.2013 / 03:52
0

Se o aplicativo mover os arquivos app.log para app.log.old , você poderá usar logrotate assim:

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

     ... 
}

Isso teria logrotate apenas lidando com os arquivos com os quais o aplicativo foi feito e, portanto, não abertos.

    
por 20.04.2012 / 15:16
0

Você poderia usar algo assim:

/path/*.log
{
  copytruncate
  missingok
  notifempty
...
    
por 08.06.2012 / 14:26

Tags