Saya telah mencari sedikit dan tidak dapat menemukan apa pun. Saya tidak ingin logrotate
untuk menyentuh file yang sedang terbuka. Saya sedang berpikir untuk melakukan sesuatu dengan lsof
tetapi saya tidak melihat cara untuk mendapatkan skrip apa pun untuk membatalkan operasi. Ada ide?
Jawaban yang Diterima:
Jika Anda memiliki nosharedscripts
set (default), dan prerotate
skrip keluar dengan kesalahan, file log yang terpengaruh tidak akan diambil tindakan lebih lanjut*.
Jadi, secara teori, Anda dapat memiliki sesuatu seperti (peringatan, belum diuji):
/var/log/application.log {
nosharedscripts
prerotate
logfile=$1
lsof $logfile >/dev/null
exit $?
endscript
...
}
jadi jika lsof
tidak dapat menemukan proses apa pun dengan $logfile
buka, prerotate
skrip akan keluar dengan 1
, dan logrotate
tidak akan mengambil tindakan apa pun pada log itu.
*Dari logrotate(8)
halaman manual di 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.
Ini mungkin bergantung pada logrotate
. Anda versi, tetapi saya tidak dapat menemukan dokumentasi tentang versi mana yang berperilaku/tidak berperilaku seperti ini.