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

qod*_*nja 16 logging centos cron date centos6

我正在玩一些日期的变化,比如

DATE = $(date)
Run Code Online (Sandbox Code Playgroud)

但这也不起作用

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}
Run Code Online (Sandbox Code Playgroud)

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

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

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

更新

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

当我尝试时只呈现 [CRON] 而没有呈现 =/

cyb*_*x86 32

Cron 不是 shell - 它不像 shell 那样解析命令。因此,您的变量被分配为静态文本。

我知道这个问题的三种解决方案:

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

* * * * * /path/to/myscript.sh
Run Code Online (Sandbox Code Playgroud)

哪里myscript.sh

DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
echo $DATEVAR >> /tmp/crontab.log
Run Code Online (Sandbox Code Playgroud)

选项 2: 直接在您的命令中包含 date 命令,并且由于整个命令被传递到 shell,日期将被处理并替换为实际日期。

DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
echo $DATEVAR >> /tmp/crontab.log
Run Code Online (Sandbox Code Playgroud)

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

* * * * * /bin/echo `date +20\%y\%m\%d_\%H\%M\%S` >> /tmp/crontab.log
Run Code Online (Sandbox Code Playgroud)

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

  • 您添加的更新中有错字 - 它是“$($DATEVAR)”而不是“$($(DATEVAR))”。可以这样想 - `$()` - 即外括号 - 启动一个新的 shell 来处理括号中的任何内容。在这种情况下,变量 $DATEVAR 被设置为一个字符串并传递给 shell。`$(DATEVAR)` 什么都不是 - 因为 `DATEVAR` 什么都不是(即它是否缺少 $ 以将其标识为变量)。您也可以在 `$DATEVAR` 周围使用反引号来获得相同的结果 (2认同)