请注意:我已经阅读了所有类似的问题,包括 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。
答案1
问题是运行时crontab
没有$PATH
设置。你实际上可以通过将其添加到通过打开的文件顶部来为其提供路径crontab -e
:
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
(或任何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 {} \;
或者
find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete
如果您没有PATH
像上面那样指定定义,请使用:
/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec /bin/rm -f {} \;
或者
/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete
答案2
尝试一下
find /home/bkp/dbdump -type f -name '*.gz' -mtime +5 -delete
答案3
如果我直接从 root 的 crontab 调用 find 命令而不是作为脚本的一部分,那么它就可以工作。
有问题的脚本使用 csh。我相信 Ubuntu 上的 root 的 cron 环境将使用 /bin/bash(或 /bin/dash?)。也许这与 find 命令的运行方式有某种冲突。
无论如何,它解决了主要问题,尽管有点不太优雅。
答案4
亲爱的 Crontab 默认使用 sh shell 而不是 bash。您可以使用 /dev/null 来清空文件。检查下面的脚本。它会有所帮助。
#!/bin/bash
tar=$(ls -lt /backup/manual | grep ^d | tail -n1 | awk '{print $NF}')
for i in $(find /backup/manual/"$tar" -type f )
do cat /dev/null > "$i"
done > /dev/null 2>&1 && mv /backup/manual/"$tar" /tmp/
解释:请使用 for 循环访问目标文件夹中的所有文件,并使其变为空,最后移动到 /tmp 目录