cron 作业不将输出重定向到文件

cron 作业不将输出重定向到文件

我在 cron 作业中设置了以下行/etc/cron.d/find_old_file

* * * * * root  [[ -d /var/log/ambari-metrics-collector ]] && find  /var/log/ambari-metrics-collector   -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n' >> /var/log/find_old_file

这个 cron 应该找到 10 天之前的日志(但前提是/var/log/ambari-metrics-collector文件夹存在)

由于一些不清楚的原因,我们注意到 /var/log/find_old_file没有创建

当我们测试它时,这条线在 shell bash 上工作正常,但在 cron 上却不行

我们还添加2>&1在文件末尾但这不起作用

请告知我的 cron 作业出了什么问题?

more /etc/cron.d/find_old_file

* * * * * root  [[ -d /var/log/ambari-metrics-collector ]] && find  /var/log/ambari-metrics-collector   -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n'   >>    /var/log/find_old_file 2>&1

例如,当我们在 shell bash 上测试它时

 [[ -d /var/log/ambari-metrics-collector ]] && find  /var/log/ambari-metrics-collector   -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n'
2018 Aug 13 12:54 collector-gc.log-201808130951
2018 Aug 13 04:22 collector-gc.log-201808130403
2018 Aug 01 12:40 gc.log-201808011229
2018 Aug 01 12:40 collector-gc.log-201808011229
2018 Aug 09 15:36 gc.log-201808091332
2018 Aug 09 10:50 gc.log-201808090825
2018 Aug 13 04:02 collector-gc.log-201808130346
2018 Aug 13 16:51 gc.log-201808131358
2018 Aug 01 13:35 gc.log-201808011241
2018 Aug 01 13:35 collector-gc.log-201808011241
2018 Aug 09 15:39 collector-gc.log-201808091332
2018 Aug 02 23:06 gc.log-201808022256

当我把这个

* * * * * root echo test  >> /var/log/test

那么它的作品,但不是我所描述的路线

那么这里发生了什么?

答案1

%crontab 中的标志参见 man (5) crontab具有特殊含义(换行符),要使命令正常工作,您需要转义它们。

A "%" character in the
   command, unless escaped with a backslash (\), will be changed into
   newline characters, and all data after the first % will be sent to
   the command as standard input.

所以,你的命令应该是:

* * * * * root  [[ -d /var/log/ambari-metrics-collector ]] && find /var/log/ambari-metrics-collector -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '\%TY \%Tb \%Td \%TH:\%TM \%P\n' >> /var/log/find_old_file

答案2

创建一个可执行的shell文件

cat /root/bin/find_old_file
    #!/bin/sh
    [[ -d /var/log/ambari-metrics-collector ]] && find  /var/log/ambari-metrics-collector   -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n' >> /var/log/find_old_file

你通过 cron 运行

cat /etc/cron.d/find_old_file
    * * * * * root  /root/bin/find_old_file

如果需要重新格式化脚本以适应 cron,将其移出 cron 通常是有益的。

相关内容