无法通过 cronjob 删除早于 x 天的文件

无法通过 cronjob 删除早于 x 天的文件

我正在使用 crontab 将 MySQL 的所有数据库备份到单独的 gnu-zip 文件中。我还想删除早于 1 天的备份文件。

我正在使用以下命令删除旧文件,但它只能通过终端运行。如果我为相同的命令设置 cronjob 那么它不起作用。我不知道出了什么问题。按照我的命令进行如下:

find path -type f -mtime +0 -delete

我在设置 cronjob 时也找不到任何错误:

0 0 * * * /path/auto_delete_backup_database.sh >/path/auto_delete_backup_database.log

任何帮助将不胜感激。

更新

正如 @Kusalananda 提到的,我跑了ls -l,结果如下面的屏幕截图所示

在此输入图像描述

那么是因为.sh文件没有执行所需的权限吗?如果是这样,我该如何授予该许可?

答案1

根据您在问题中所显示的内容和评论里说,你的脚本是不是可执行文件且不包含#!-line。

至少,您应该使脚本可执行

chmod +x /path/auto_delete_backup_database.sh

并给它一个适当的#!- 行:

#!/bin/sh

(这需要是脚本的第一行,前面没有空格)。

当脚本不可执行时,它就根本无法作为脚本使用。尝试运行这样的文件将返回“权限被拒绝”错误(您的 cron 守护程序很可能已尝试向您发送电子邮件来告诉您这一点)。

如果没有#!-line 告诉调用 shell 使用哪个 shell 解释器来运行脚本,这取决于在什么 shell 上调用它会发生什么。您应该始终#!在脚本的开头有适当的 - 行。在这种情况下,由于没有bash使用任何特殊功能,因此使用/bin/sh.

显然,您也可以find直接使用 cron 安排命令:

0 0 * * * find path -type f -mtime +0 -print -delete >/path/auto_delete_backup_database.log 2>&1

我认为这适合单命令 cron 作业。任何更奇特的内容都最好作为包装脚本的一部分进行安排。

我添加-printfind上面的命令中,这将使其输出尝试删除的文件的名称(否则它将保持沉默)。

答案2

使用chmod命令设置执行位,例如。

chmod ugo+x auto_delete_backup_database.sh

相关内容