He buscado un poco y no encuentro nada. No quiero logrotate
para tocar los archivos que están abiertos actualmente. Estaba pensando en hacer algo con lsof
pero no vi una manera de hacer que ninguno de los scripts cancelara una operación. ¿Alguna idea?
Respuesta aceptada:
Si tiene nosharedscripts
set (predeterminado) y prerotate
el script sale con un error, el archivo de registro afectado no tendrá ninguna otra acción sobre él*.
Entonces, en teoría, podría tener algo como (advertencia, no probado):
/var/log/application.log {
nosharedscripts
prerotate
logfile=$1
lsof $logfile >/dev/null
exit $?
endscript
...
}
entonces si lsof
no puedo encontrar ningún proceso con $logfile
abierto, el prerotate
el script saldrá con 1
y logrotate
no realizará ninguna acción en ese registro.
*Desde el logrotate(8)
página man en 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.
Este puede ser dependiente de su logrotate
versión, pero no puedo encontrar ninguna documentación sobre qué versiones se comportan / no se comportan de esta manera.