如何每小时运行一次 logrotate

Posted

技术标签:

【中文标题】如何每小时运行一次 logrotate【英文标题】:how to run a logrotate hourly 【发布时间】:2019-10-13 16:34:50 【问题描述】:

我创建了一个 program.conf,它每小时在 EC2 实例中记录我的日志。当我强制它命令时,logrotate 运行良好(通过 sudo logrotate program.conf --verbose --force)但它不是每小时运行一次。

我通过谷歌搜索这个问题尝试了几种解决方案,例如将我的 program.conf 放入 /etc/logrotate.d 并将 logrotate 从 cron.dail 移动到 cron.hourly。 但它不起作用。

这是我的 program.conf :

/home/user_i/*.log
hourly
missingok
dateext 
rotate 1
compress
size 100M
sharedscripts
postrotate
    /usr/bin/bash file.sh
endscript

请问你有什么想法吗?

谢谢

【问题讨论】:

【参考方案1】:

OP 在评论中指出他们不能使用 crontab,需要使用 /etc/cron.hourly 的解决方案。

    获取您用于定义 logrotate 参数的“program.conf”文件,并将该文件放在 root 用户可以访问但不能在 /etc/logrotate.d/ 目录中的某个位置。这个想法是,如果我们以自己的方式每小时运行一次,我们不希望 logrotate 在正常运行时执行此轮换。这个文件只需要root可读,不能执行。

    您需要确保 ALL 您需要的 logrotate 参数都在此文件中。我们将使用 logrotate 仅使用此配置文件执行轮换,但这也意味着您在 /etc/logrotate.conf 中定义的任何“全局”参数都不会被考虑在内。如果您的自定义轮换需要遵守其中的任何参数,则需要将它们复制到您的“program.conf”文件中。

    在您的 /etc/cron.hourly 文件夹中,创建一个新文件(可由 root 执行),它将是每小时执行一次自定义轮换的脚本(相应地调整您的 shell/shebang):

#!/usr/bin/bash

logrotate -f /some/dir/program.conf

这将使 cron 每小时为该配置文件强制轮换一次,而不会对 logrotate 的正常功能产生任何影响。

【讨论】:

您好,非常感谢,它成功了,除了您的解决方案,我更改了我的日志文件的一些访问权限(在 /var/log/mylog_folder/ 中) @delx_s 很高兴听到,如果您对您的问题满意,请将答案标记为已接受。【参考方案2】:

您需要在 crontab 中添加作业

crontab -e

然后添加一个在过去 14 分钟后每小时运行的作业,

14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

取自:https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-16-04

另外检查 crontab 是否真的在运行

service crontab status

如果它停止了,你可以通过这样做来启动它

service crontab start

【讨论】:

感谢您的回答,我已经测试过了,它工作正常,但我不能使用 crontab,因为我还有一个。 你知道如何使用 /etc/cron.hourly/ 吗? @delx_s mv /etc/cron.daily/logrotate /etc/cron.daily。还要确保你的脚本有每小时一次的 logrotate 设置。【参考方案3】:

在 Debian Bullseye(可能还有其他基于现代 systemd 的系统)上,logrotate 由一个每天运行一次的 systemd 计时器处理。要将 logroate 的运行频率更改为每小时频率,您必须覆盖默认的 logrotate.timer 单位。

执行systemctl edit logrotate.timer 并插入以下覆盖:

[Timer]
OnCalendar=
OnCalendar=hourly
AccuracySec=1m

然后运行systemctl reenable --now logrotate.timer 以激活更改。

空的OnCalender 选项resets the previous defined values。

默认logroate.timer 已将AccuracySec 选项设置为一小时。不幸的是,无法将其重置为空值,因此必须手动将其设置为一分钟。

【讨论】:

以上是关于如何每小时运行一次 logrotate的主要内容,如果未能解决你的问题,请参考以下文章

如何每 2 小时运行一次 cron 作业?

Paypal Recurring Profile:如何每小时运行一次?

如何安排一个函数在 Flask 上每小时运行一次?

每小时运行一次java函数

如何在服务器上的特定小时内每分钟运行一次cron作业

如何在 .NET 中每小时(或每小时的特定时间间隔)引发一个事件?