Я объединился logrotate
с некоторым волшебством оболочки получить желаемый эффект. В основном logrotate все еще отвечает за перемещение и сжатие файлов и затем начинание, сценарий должен был удалить старые файлы, а также обеспечение каталога не имеет больше чем приблизительно 50 файлов. Вот то, что я сделал:
/mycores/core_* {
compress
daily
missingok
nocreate
nodelaycompress
olddir /mycores/old
sharedscripts
postrotate
# delete all core_*.gz files older than 28 days
find /mycores/old -name "core_*.gz" -mtime +28 -delete
# make sure we have a max of 50 files; delete the oldest files if we have too many
for filename in $(find /mycores/old/ -name "core_*.gz" -printf "%T+ %p\n" | sort --reverse | tail --lines=+51 | cut -d' ' -f2); do rm $filename; sleep 0.5; done
endscript
}
Я не лучший сценарист удара там, так, чтобы postrotate
раздел сценария мог бы быть более тяжелым, чем необходимый... :)
Мы используем сценарий как это. Я не вижу точку вовлечения logrotate как
сценарий:
#!/bin/bash
EMAIL_TO="<%= mail %>"
EMAIL_SUBJ="Found core files on `hostname -s`"
DATETIME=`date +"%F-%H%M%S"`
EMPTY_CORE_FILES=`find /var/log/core/ -mmin +60 -type f -empty -not -name "*.gz" -not -name "*.zip" -print -exec rm {} \;`
CORE_FILES=`find /var/log/core/ -mmin +60 -type f -not -empty -not -name "*.gz" -not -name "*.zip"`
NUM_CORE_FILES=`echo $CORE_FILES | wc -w`
lockfile="/tmp/`basename $0`.lock"
lockfile -1 -r 5 -l 84600 ${lockfile} || exit 1
trap "/bin/rm -f $lockfile" EXIT INT TERM
for f in $CORE_FILES;
do
gzip -9 $f
done
if [ $NUM_CORE_FILES != 0 ]
then
mail "$EMAIL_TO" -s "$EMAIL_SUBJ" <<EOF
I found and gzipped $NUM_CORE_FILES on $HOSTNAME in /var/log/core, please investigate.
Files Found:
$CORE_FILES
Empty Files:
$EMPTY_CORE_FILES
EOF
fi