如何设置DATE变量以在crontab输出的日志中使用?


10

我在玩aroudn时有一些变化,例如

DATE = $(date)

但这也不起作用

crontab -e

CRONLOG=/tmp/log/crontab.log
DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
* * * * * echo $DATEVAR >> /tmp/log/crontab.log
*/2 * * * * echo "$DATEVAR hello" >> ${CRONLOG}
*/1 * * * * echo 'every minute' >> ${CRONLOG}

这只是按原样输出文本...

我想在crontab.log中创建一个带有每次更新时间戳的日志条目

如何在CentOS 6上执行此操作?

更新

DATEVAR=date +20%y%m%d_%H%M%S
*/1 * * * * /bin/echo [CRON] $($(DATEVAR)) >> /tmp/log/crontab.log

尝试时仅呈现[CRON]而没有显示= /

Answers:


28

Cron不是外壳程序-它不会以与外壳程序相同的方式来解析命令。这样,您的变量就被分配为静态文本。

我知道此问题有三种解决方案:

选项1: 使用Shell脚本生成命令,包括所需的任何变量和逻辑-并从cron调用该Shell脚本。

* * * * * /path/to/myscript.sh

myscript.sh:

DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
echo $DATEVAR >> /tmp/crontab.log

选项2: 将date命令直接包含在命令中,并且由于整个命令都传递给了shell,因此将处理该日期并将其替换为实际日期。

* * * * * /bin/echo `date +20\%y\%m\%d_\%H\%M\%S` >> /tmp/crontab.log

选项3:在cron中设置字符串变量,并将其传递给要处理的命令(注意-百分号不需要转义,变量本身包装在$()中以在单独的shell中执行-反引号应相同):

DATEVAR=date +20%y%m%d_%H%M%S
* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

(在以上所有情况下,您当然都可以使用变量作为日志路径,而不是对其进行“硬编码”。)


1
感谢伟大的反馈+1,我试图将其添加到crontab中,但是这样做没有效果= /它从不渲染DATEVAR
qodeninja

我只是在与RHEL / CentOS6兼容的系统上进行了此操作,它给出了预期的结果(即,在文件中添加了带有日期的新行)。您尝试了哪个选项(上面的3个),结果是什么-具体而言-/ var / log / cron中是否有错误?(如果您使用脚本选项,则a)不要忘了chmod + x,b)首先自行尝试(即不通过cron))
cyberx86

1
选项3 =],我曾经尝试过这样做,但是它没有渲染。但是现在我注意到您做了些小事。为什么将$($(DATE))加倍?请参阅上方的我的更新
qodeninja 2011年

1
您在添加的更新中有错字- $($DATEVAR)不是$($(DATEVAR))。可以这样考虑- $()外支架-启动一个新的外壳来处理支架中的所有内容。在这种情况下,变量$ DATEVAR设置为字符串,然后传递给外壳。$(DATEVAR)什么都不是-因为DATEVAR什么都不是(即是否缺少$以标识为变量)。您也可以使用反引号$DATEVAR获得相同的结果
cyberx86

很公平。更新了它。让我们试试这个坏男孩!-哈扎阿!它工作了大声笑
qodeninja
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.