请注意:我已经阅读了所有类似的问题。cron、路径、环境变量等,但没有找到可以解决我的特定问题的方法。
我有一个脚本可以进行一些 MySQL 转储,然后像这样删除旧的转储:
/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete
(上面的命令已根据评论的建议从我原来的命令中修改)
但是,当 cron 运行此脚本时,这些文件永远不会被删除。cron 用户是 root。
调试说明
如果我手动运行出现命令的脚本,它会按预期删除它们。
如果我以 root 身份从命令行自行运行上述 find 命令,它会按预期删除它们(并且使用 -print 它会按预期返回超过 5 天的文件列表)
我还在 root 的 crontab 中添加了一个显式路径语句,但这
并没有改变任何东西。Cron 不发送错误,如果我将查找操作通过管道传输到日志文件,
则该文件为空或根本没有创建。我正在使用 Ubuntu 服务器 14.04.03 LTS。
问题是它运行时
crontab
没有设置。$PATH
您实际上可以通过将其添加到通过以下方式打开的文件的顶部来为其提供路径crontab -e
:(或任何
PATH
你喜欢使用的东西)。这意味着您可以避免直接从 cron 指定命令的完整路径。您的原始命令存在多个问题。您基本上是在要求 shell 进行通配符扩展,而不是
find
. 其次,您没有为rm
;提供完整的路径。使用/bin/rm
or/usr/bin/rm
,它位于系统上的任何位置(请参阅 参考资料which rm
)。find 的第一个参数是“要搜索的位置”,然后使用各种
-<option>
s 指定“搜索查询”。因此,您要运行的命令的正确格式是:或者
如果您没有
PATH
像上面那样指定定义,请使用:或者
试试这个
如果我直接从 root 的 crontab 调用 find 命令,而不是作为脚本的一部分,那么它可以工作。
有问题的脚本使用 csh。我相信 Ubuntu 上 root 的 cron 环境将使用 /bin/bash(或 /bin/dash?)。也许这在某种程度上与 find 命令的运行方式有冲突。
无论哪种方式,它都解决了主要问题,尽管有些不雅。
Dear Crontab 默认使用 sh shell 而不是 bash。您可以使用 /dev/null 来清空文件。检查下面的脚本。我会帮你的。
说明:请使用 for 循环访问目标文件夹中的所有文件并将它们设为 null 并最后移动到 /tmp 目录