创建每天将输出发送到文件并每月覆盖此文件的cron作业

时间:2018-11-18 22:26:33

标签: linux cron

我需要有关cron作业的帮助,该作业每天将输出发送到文件并每月覆盖此文件,我唯一的问题是如何使其每个月都被覆盖,因此我需要在一项作业中执行此操作,因此创建2项作业将其输出到文件以及其他每个月将其删除的图片

1 个答案:

答案 0 :(得分:0)

您可以每天运行它,但可以使用date +%w打印日期,并根据此采取不同的操作(用>调用来掩盖文件而不是附加>>)。

请注意,某些cron守护程序要求%才能转义,因此\%

# Run every day at 00:30 but overwrite file on Mondays; append every other day.
# Note that this requires bash as your shell.
# May need to override with SHELL=/bin/bash
30 00 * * * if [ "$(date +\%w)" = "1" ]; then /your/command > /your/logfile; else /your/command >> /your/logfile; fi

编辑:

您在上面的评论中提到,您的实际目标是日志轮换。

Linux系统的规范是使用logrotate之类的东西来管理这样的日志。这样做的好处还在于,您可以保留多个先前的日志文件,并根据需要压缩它们。

我建议您使用logrotate配置代码片段来实现您的目标,而不是在cron作业本身中完成。如果只是为了日志轮换,将其放在cron作业中是违反直觉的。

这是一个示例logrotate代码段,根据您使用的Linux发行版,它可能位于/etc/logrotate.d/yourapp之类的位置。

/var/log/yourlog {
    daily
    missingok
    # keep one year of logs
    rotate 365
    compress
    # keep the first one uncompressed for ease of viewing
    delaycompress
}

这将导致您的日志文件每天轮换,第一次迭代类似/var/log/yourlog.1,然后是压缩迭代,例如/var/log/yourlog.2.gz/var/log/yourlog.3.gz等。

因此,我认为您的问题实际上不是Cron问题。上面使用的cron欺骗手段仅在以下情况下才适用:例如,当您想在一个月的最后一个星期日或该月的最后一天解雇某项工作,或其他无法用cron语法表达的条件时