请注意:我已经阅读了所有类似的问题。cron、paths、env 变量等等,但没有发现可以为我的特定问题提供解决方案。
我有一个脚本可以进行一些 MySQL 转储,然后像这样删除旧的:
/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete
Run Code Online (Sandbox Code Playgroud)
(以上命令已根据评论中的建议从我的原始命令中修改)
但是,当 cron 运行此脚本时,这些文件永远不会被删除。cron 用户是 root。
调试注意事项
如果我手动运行出现命令的脚本,它会按预期删除它们。
如果我以 root 身份从命令行单独运行上述 find 命令,它会按预期删除它们(并且使用 -print 它会按预期返回超过 5 天的文件列表)
我还向 root 的 crontab 添加了显式路径语句,但这
不会改变任何内容。
Cron 不会发送任何错误,如果我将查找操作通过管道传输到日志文件,
则会显示为空或根本没有创建。
我正在使用 Ubuntu 服务器 14.04.03 LTS。
问题是它运行时crontab没有$PATH设置。您实际上可以通过将其添加到通过crontab -e以下方式打开的文件的顶部来为其提供路径:
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
Run Code Online (Sandbox Code Playgroud)
(或任何PATH您喜欢使用的)。这意味着您可以避免直接从 cron 指定命令的完整路径。
您的原始命令存在多个问题。您基本上是在要求 shell 进行通配符扩展,而不是find. 其次,您没有提供完整的路径rm;使用/bin/rm或/usr/bin/rm,它位于系统上的任何位置(请参阅which rm)。
find 的第一个参数是“要搜索的位置”,然后用各种-<option>s指定“搜索查询” 。因此,您要运行的命令的正确格式是:
find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec rm -f {} \;
Run Code Online (Sandbox Code Playgroud)
或者
find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete
Run Code Online (Sandbox Code Playgroud)
如果您没有PATH像上面那样指定定义,请使用:
/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec /bin/rm -f {} \;
Run Code Online (Sandbox Code Playgroud)
或者
/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete
Run Code Online (Sandbox Code Playgroud)
如果我直接从 root 的 crontab 调用 find 命令而不是作为脚本的一部分,那么它就可以工作。
有问题的脚本使用 csh。我相信 Ubuntu 上 root 的 cron 环境将使用 /bin/bash (或 /bin/dash?)。也许这与 find 命令的运行方式存在某种冲突。
不管怎样,它解决了主要问题,尽管有点不优雅。
| 归档时间: |
|
| 查看次数: |
12090 次 |
| 最近记录: |