crontab中的变量?

JP *_*shy 50 cron

如何在我的crontab中存储变量?我知道它不是shell但是我想要一些常量,比如我的应用程序的路径或其他东西?

思考?

mkb*_*mkb 80

在Vixie cron中,这可能是最常见的,你几乎可以像shell脚本一样.

VARIABLE=value
PATH=/bin:/path/to/doathing
0 0 * * * doathing.sh $VARIABLE
Run Code Online (Sandbox Code Playgroud)

手册页说:

crontab中的活动行将是环境设置或cron命令.环境设置的形式,

     name = value
Run Code Online (Sandbox Code Playgroud)

等号(=)周围的空格是可选的,值中任何后续的非前导空格都是分配给name的值的一部分.值字符串可以放在引号中(单引号或双引号,但匹配)以保留前导或尾随空白.名称字符串也可以放在引号中(单个或双重,但匹配)以保留前导,尾随或内部空白.

您可以通过查看手册页来判断您是否拥有Vixie cron crontab; 作者将是Paul Vixie.不同的crons可能支持也可能不支持(例如,BusyBox的cron,不支持),在这种情况下,最好的选择是将命令包装在shell脚本中,然后从cron运行该脚本.事实上,对于任何复杂的事情来说,这是一件好事.

  • 这篇文章有误导性 - cron只支持在cron表中设置的一组特定变量; 例如HOME,MAILTO,SHELL等.你*不能*设置自定义变量,例如FOO =/foo/dir.我想我会发布这个帖子,因为这篇文章引导我走错了路几个小时. (22认同)
  • FWIW我正在使用Vixie的cron,我可以定义任何我想要的变量.但是,无论顺序如何,这些变量的值都不会与其他变量值进行插值**.例如:`FOO = $ {HOME}/foo`不能正常工作(它留下了"$ {HOME}"`verbatim/un-interpolated). (22认同)
  • 回来看看我3年前问过的这个问题。事情进展得很有趣吧? (5认同)
  • @mkb LoL - 他们没有把"man"添加到发行版中(我知道大多数人都支持这个),并且,令人费解的是,"哪个cron`什么也没有显示.`crontab -h`显示:`BusyBox v1.01(2013.06.23-18:42 + 0000)多调用二进制` - 无论这意味着什么. (2认同)
  • 只是一个观察:crontab接受我想要定义的任何符号; 然而有趣的是,这些定义在crontab中是全局的.定义与cron命令混合的顺序似乎并不重要. (2认同)
  • @PierreD的评论非常重要,无时无刻不在困扰着我。烦人... (2认同)

Bro*_*ace 11

我认为这里需要指出的重要事实是(正如 Pierre D 在 2015 年 3 月 25 日 18:58 的早期评论中所述)变量声明不会扩展/插值,因此不能嵌入其他变量值。

变量仅在命令本身中扩展/插值。

所以:

var1 = bar
var2 = foo${var1}
42 17 * * * /path/to/command ${var2}
Run Code Online (Sandbox Code Playgroud)

结果是:/path/to/command foo${var1}

尽管:

var1 = bar
var2 = foo
42 17 * * * /path/to/command ${var2}${var1}
Run Code Online (Sandbox Code Playgroud)

结果是:/path/to/command foobar

因此,在我的情况下,以下工作正常,不需要包装 shell 脚本:

SHELL=/bin/bash
timestamp=date +20%y_%m_%d_%H_%M_%S
logdir=/my/log/dir

0 2 * * * /my/command/path/mycmd param >> ${logdir}/myfile_$(${timestamp}).log
Run Code Online (Sandbox Code Playgroud)

像这样的诗句不起作用:

logfile = /my/log/dir/myfile_${timestamp}.log
Run Code Online (Sandbox Code Playgroud)

因为后者没有扩展,而是被解释为包括“${”和“}”作为字符串的一部分。


小智 10

为了保持我的 crontab 干净,我只会调用一个 shell 脚本并在脚本中做一些有趣的事情。


Jam*_*ond 5

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

在此 Docker 映像上进行测试(将上面的 crontab 粘贴到crontab.txt):

FROM debian:10-slim

# Install docker (Yep, this is a docker in docker):
RUN curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh

# Install CRON:
RUN apt-get update && apt-get install -y --no-install-recommends cron

# Add a crontab_config.txt task:
COPY crontab.txt /var/crontab.txt
RUN crontab /var/crontab.txt

ENTRYPOINT ["cron", "-f"]
Run Code Online (Sandbox Code Playgroud)

将其添加到 crontab 以在另一个 docker 容器内运行任何命令:

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