请注意 : 我已经阅读了所有类似的问题。 cron,path,envvariables等,但没有发现任何解决scheme提供我的特定问题。
我有一个脚本,使一些MySQL转储,然后删除旧的像这样:
/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete
( 上面的命令已经从我原来的命令修改的意见build议 )
但是,当cron运行这个脚本时,这些文件永远不会被删除。 cron用户是root用户。
debugging笔记
如果我手动运行出现该命令的脚本,则会按预期删除它们。
如果我以root身份从命令行自己运行上面的find命令,则会按预期方式删除它们(并且使用-print它将返回如预期的早于5天的文件列表)
我也为根的crontab添加了一个显式path声明,但是
这不会改变任何东西。
Cron不会发送错误,如果我将查找操作传送给日志文件,
这是空的或根本不创造。
我正在使用Ubuntu服务器14.04.03 LTS。
问题是crontab
运行时没有设置$PATH
。 您可以通过将其添加到通过crontab -e
打开的文件顶部来提供path:
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
(或者你喜欢使用的任何PATH
)。 这意味着你可以避免直接从cron指定命令的完整path。
您的原始命令有多个问题。 你基本上要求shell执行通配符扩展,而不是find
。 其次,你没有提供完整的rm
path; 使用/bin/rm
或/usr/bin/rm
,无论它位于您的系统上(请参阅which rm
)。
查找的第一个参数是“要search的位置”,然后用各个-<option>
指定“search查询”。 所以,你想运行的命令的格式是:
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
试试这个
find /home/bkp/dbdump -type f -name '*.gz' -mtime +5 -delete
如果我直接从root的crontab调用find命令,而不是作为脚本的一部分,那么它的工作原理。
有问题的脚本使用csh。 我相信Ubuntu的root cron环境会使用/ bin / bash(或/ bin / dash?)。 也许这与find命令的运行方式有些冲突。
无论哪种方式,它解决的主要问题,尽pipe有点不雅。