【问题标题】:how to run a logrotate hourly如何每小时运行一次 logrotate
【发布时间】: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
}

请问你有什么想法吗?

谢谢

【问题讨论】:

    标签: amazon-ec2 logrotate


    【解决方案1】:

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

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

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

    3. 在您的 /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 选项设置为一小时。不幸的是,无法将其重置为空值,因此必须手动将其设置为一分钟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2011-09-19
      • 2015-11-20
      • 2012-10-03
      相关资源
      最近更新 更多