我正在使用 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 作业。任何更奇特的内容都最好作为包装脚本的一部分进行安排。
我添加-print
到find
上面的命令中,这将使其输出尝试删除的文件的名称(否则它将保持沉默)。
答案2
使用chmod
命令设置执行位,例如。
chmod ugo+x auto_delete_backup_database.sh