如何每小时运行一次 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的主要内容,如果未能解决你的问题,请参考以下文章