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

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

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

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] 而没有任何内容 =/

答案1

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

我知道有三种方法可以解决此问题:

选项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: 将日期命令直接包含在命令中,并且由于整个命令传递给 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

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

答案2

“问题”在于cron将百分号用作特殊字符。您必须将其括起来,这样它才会被忽略cron,但 shell 不会。像我见过的大多数人一样,他们花了数小时来研究何时、如何以及在何处引用什么,我也经历了这种折腾。

以下是我发现的适用于所有 *nix 版本的解决方案:

# Define the percent sign in a variable.
P=%
#
# Now use it in a $() subshell. Don't get freaked about the double quotes
# inside the $(), they are processed by the subshell.
57 2 * * * root /bin/echo "[CRON] at $(date "+${P}d-${P}b${P}Y")" 1>>/tmp/crontab.log 2>&1

正如 Perl 世界中的一句老话:做事总有不止一种方法。我并不是说这是唯一方法或最佳方法——我要说的是,这适用于在 CentOS、Debian、Ubuntu、Mac 和 AIX 上运行的 crontab 条目,因此我坚持使用这种方法。

答案3

crontab这只是在文件中使用变量及其在字符串中的替换的一个工作示例:

CURRENT_TIME=date +%Y.%m.%d_%H:%M:%S.%3N
CURRENT_DATE=date +%Y_%m_%d

SIMPLE_VAR=the_simple_var
LOG_DIR=/var/log/cron

* * * * * /bin/echo "simple variable test! ${SIMPLE_VAR}__test!" >> "${LOG_DIR}/test.log"
* * * * * /bin/echo "complex variable test! $(${CURRENT_TIME})__test!" >> "${LOG_DIR}/test.log"

相关内容