使用 cron 作业删除日志文件

问题描述 投票:0回答:9

嗨。我想从文件夹中删除过去 7 天的所有日志文件,但保留所有其他文件。我可以使用下面的命令吗?如何指定只删除扩展名为.log的文件?

 find  /path/to/file -mtime +7 -exec rm -f {} \; 

我是否需要将此命令写入某个文件,或者我可以将其写入命令提示符并让它每天自动运行吗?

我不知道如何在 Linux 中运行 cron 作业。

linux cron ubuntu-12.04
9个回答
24
投票

使用通配符。只需将其放入您的

crontab
使用
crontab -e
选项即可编辑您的 crontab 作业。
参见示例:

* * * * *  find  /path/to/*.log -mtime +7 -exec rm -f {} \; 

只是为了增加答案,请查看这篇关于如何使用您的

crontab
的好文章!在 Linux 中.


19
投票

您可以通过运行 crontab -e 来编辑您的

个人
crontab。 这将保存到
/var/spool/cron/<username>
。该文件将是所有者的用户名,因此 root 将为 /var/spool/cron/root。文件中的所有内容都以文件所有者的身份运行。

crontab 的语法如下:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

当您通过 crontab -e 编辑自己的

personal
crontab 时,您会省略用户名字段,因为用户是通过文件名推断出来的(请参阅第一段)。

话虽如此,您的条目应该如下所示:

0 5 * * *  find  /path/to/*.log -mtime +7 -delete

这将在每天系统时间凌晨 5:00 运行。鉴于您要删除 7 天旧的文件,我认为您不需要它比每天更频繁地运行。

-exec

 选项完全符合您的要求时,请不要过度使用 
-delete
 选项。 exec 为每个文件创建一个 shell,并且过度浪费系统资源。

完成后,您可以使用

crontab -l

 列出您的个人 crontab。

ps。大多数 Linux 系统上的默认编辑器是 vi,如果您不知道 vi,请通过设置环境变量来使用简单的东西,例如 nano

export EDITOR=nano


    


6
投票
find /path/to/dir-containing-files -name '*.log' -mtime +7 -exec rm -f {} \;

要创建 cron 作业,请将包含以下内容的文件放入 /etc/cron.daily 目录中:

#!/bin/sh find /path/to/dir-containing-files -name '*.log' -mtime +7 -exec rm -f {} \;
    

4
投票
您应该使用

crontab -e

 编辑您的 crontab 并安排作业。它可能看起来像这样:

* 1 * * * /usr/bin/find /path/to/file -name '*.log' -mtime +7 -exec rm -f {} \;

这将在每天凌晨 1 点递归删除 /path/to/file 目录中的所有 .log 文件。


2
投票
由于这是关于日志文件,因此您应该查看

logrotate

。它每天从系统 cron 作业运行,并将根据 /etc/logrotate.conf 文件中的规则为您轮换日志,该文件通常包括 /etc/logrotate.d 目录。所以不需要 crontab 也不需要 find。

如果您无权将文件添加到 /etc/logrotate.d 以进行自己的配置,您也可以拥有自己的 cron 作业。

/etc/logrotate.d 中有很多示例。

它希望您的应用程序写入单个文件。它不适用于每天登录不同日志文件的应用程序。应用程序通常不需要这样做。如果应用程序保持日志文件打开,logrotate 可以运行 postrotate 脚本来告诉应用程序重新打开日志文件。


1
投票
你们正在努力做到这一点。尝试使用清除命令

* * * * 0 clear > /home/user/CronLog.txt:



其中 0 是星期日,7 是星期六。 与添加到日志中的“>>”相反,“">”将清除日志。 如果您的日志文件是 root,则在“clear”之前输入“root”,如下所示

* * * * 0 root clear > /home/user/CronLog.txt


    


0
投票
在谷歌搜索这个特定主题后,我发现很多人建议使用

-delete 选项,如下所示:

* * * * * find /path/to/*.log -mtime +7 -delete;

这个版本的好处是它很容易记住,并且性能会更好,因为

-exec 将为每个要删除的文件生成一个新进程。

以下是一些参考:

https://linuxaria.com/howto/linux-shell-how-to-use-the-exec-option-in-find-with-examples
https://unix.stackexchange.com/questions/167823/find-exec-rm-vs-delete


0
投票
这将删除超过 7 天的日志文件

* * * * * find /path/to -name '*.log' -mtime +7 -exec rm -f {} \;

这将删除超过 30 分钟的日志文件

* * * * * find /path/to -name '*.log' -mmin +30 -exec rm -f {} \;
    

0
投票
如果删除日志文件,则必须重新启动服务,所以我宁愿使用命令“truncate”,该命令会清空日志文件而不删除它。

© www.soinside.com 2019 - 2024. All rights reserved.