Crontab中Find -exec命令无法执行的问题及解决方法咨询
解决crontab中find命令-exec选项的执行问题
你的问题核心是cron的shell解析规则和交互式shell不同,导致-exec的分号没有正确传递给find命令,同时命令替换和路径问题也可能影响执行。以下是几种可行的解决方法:
方法1:直接修改crontab命令,调整转义与命令替换
将命令中的分号用单引号包裹,同时用$()替代反引号(更可靠的命令替换方式),并指定date命令的绝对路径:
40 12 * * * /bin/find /tmp/zzz -type f -name "$(/bin/date -d '-1 day' '+server.log.%Y-%m-%d')" -exec echo {} ';'
或者对分号进行双重转义(适配cron的解析规则):
40 12 * * * /bin/find /tmp/zzz -type f -name `date -d '-1 day' '+server.log.%Y-%m-%d'` -exec echo {} \\;
方法2:编写独立shell脚本(推荐)
把逻辑写到脚本里,避免cron的shell解析问题,同时便于维护:
- 创建脚本文件(比如
/usr/local/bin/find_old_log.sh):
#!/bin/bash # 生成前一天的日志文件名 LOG_FILENAME=$(date -d '-1 day' '+server.log.%Y-%m-%d') # 执行find命令 /bin/find /tmp/zzz -type f -name "$LOG_FILENAME" -exec echo {} \;
- 给脚本添加执行权限:
chmod +x /usr/local/bin/find_old_log.sh
- 在crontab中调用脚本:
40 12 * * * /usr/local/bin/find_old_log.sh
额外注意事项
- cron的PATH环境变量默认很窄,所有命令尽量使用绝对路径(比如
/bin/find、/bin/date),避免因找不到命令导致执行失败。 - 如果你的系统date命令不支持
-d选项(比如某些轻量系统的busybox date),可以用date -v -1d '+server.log.%Y-%m-%d'(BSD系统)或者其他方式生成前一天的日期。
内容的提问来源于stack exchange,提问作者zaozaoer
相关产品推荐
相关产品推荐

