我可以使用 logrotate 来旋转 /core 文件吗?

我可以使用 logrotate 来旋转 /core 文件吗?

在基于 Linux 的远程设备上,我本想使用 logrotate 来管理我们的设备可能创建的任何核心文件。但 logrotate 似乎将每个核心文件视为一个唯一文件,因为文件名包含 PID。这打破了 logrotate 通常轮换文件的方式。例如:

core_123
core_222
core_555

它不会将这些视为同一文件的 3 个变体,而是将其视为 3 个唯一文件。因此,如果我有rotate 50/etc/logrotate.d/core它将愿意轮换 50 个不同的core_123文件,以及 50 个不同的core_222文件等,从而可能产生数百或数千个文件。相反,我想确保 logrotate 最多管理 50 个 core_* 文件。

这是我尝试运行的确切 logrotate 文件:

/mycores/core_* {
    compress
    daily
    maxage 28
    missingok
    nocreate
    nodelaycompress
    olddir /mycores/old
    rotate 50
}

我怀疑 logrotate 无法做到这一点,但我认为我会在 serverfault 上发布,以防我错过文档中的某些内容。

答案1

我结合了logrotate一些 shell magic 来获得所需的效果。基本上,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
}

我不是最好的 bash 脚本编写者,因此postrotate脚本部分可能比必要的更重...:)

答案2

我们使用这样的脚本。我认为没有必要使用 logrotate 作为

  1. 这些不是日志文件
  2. 你没有旋转它们

脚本:

#!/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

相关内容