crontab中的变量?

crontab中的变量?,cron,Cron,如何在crontab中存储变量?我意识到它不是shell,但我想有一些常量,比如我的应用程序的路径或其他什么?在Vixie cron中,这可能是最常见的,您可以像shell脚本一样执行此操作 VARIABLE=value PATH=/bin:/path/to/doathing 0 0 * * * doathing.sh $VARIABLE 手册页上说: crontab中的活动行将是环境设置或cron命令。环境设置的形式如下: name = value 其中,等号(=)周围的空格是可

如何在crontab中存储变量?我意识到它不是shell,但我想有一些常量,比如我的应用程序的路径或其他什么?

在Vixie cron中,这可能是最常见的,您可以像shell脚本一样执行此操作

VARIABLE=value
PATH=/bin:/path/to/doathing
0 0 * * * doathing.sh $VARIABLE
手册页上说:

crontab中的活动行将是环境设置或cron命令。环境设置的形式如下:

     name = value
其中,等号(=)周围的空格是可选的,值中的任何后续非前导空格都将是指定值的一部分 点名。值字符串可以放在引号中(单引号或双引号,但要匹配),以保留前导空格或尾随空格。名字 字符串也可以放在引号中(单引号或双引号,但要匹配),以保留前导空格、尾随空格或内空格


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

为了保持我的crontab干净,我只需调用一个shell脚本并在脚本中执行有趣的操作。

这只是一个在
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"
在此Docker映像上测试(将上面的crontab粘贴到
crontab.txt
):

将其添加到crontab以在其他docker容器中运行任何命令:

/usr/bin/docker exec container\u name ls-la

如果要为特定作业设置一些环境变量,只需将它们内联到
sh
代码段中即可

42 17 * * * myvariable='value' path/to/command
在不明显的情况下,
sh
语法
var=value命令
var
设置为
,持续时间为
命令
。如果你需要不止一个,你可以有几个

42 17 * * * firstname='Fred` lastname='Muggs' path/to/command
如果您想从多个地方访问非平凡的变量,可以将它们放在一个单独的文件中,并从shell启动脚本和
cron
作业中获取该文件的源(

假设您有一个文件
$HOME/bin/myenv
,其设置如下

myvar=$(output of some complex command)
another='another
complex
variable'
然后你可以加上

$HOME/bin/myenv
到您的
.profile
(或
.zshrc
.bash\u profile或您拥有的其他文件;但是
.profile
是可移植的,也可由
sh`)和

crontab

注意文件名前空格前的一个点;这是dot命令(在例如Bash中也称为
source
),它将文件读入当前shell实例,就好像您在这里键入了文件中的内容一样

严格来说,
$HOME/
部分是多余的
cron
作业将始终在调用用户的主目录中运行


显然,如果您希望变量在整个
crontab
中为真,请在计划作业之前将其设置在顶部。

回来看看我3年前提出的这个问题。有趣的事情是怎么回事?这篇文章是误导性的-cron只支持cron表中设置的一组特定变量;e、 例如HOME、MAILTO、SHELL等。您不能设置自定义变量,例如FOO=/FOO/dir。我想我会发布这篇文章,因为这篇文章让我走了几个小时的错误之路。@mkb LoL-他们没有费心将
man
添加到发行版(我知道大多数其他人都支持这一点),而且,令人困惑的是,
哪个cron
什么也没有显示
crontab-h
显示:
BusyBox v1.01(2013.06.23-18:42+0000)多调用二进制文件
-不管这意味着什么。只是观察:crontab正在接受我想要定义的任何符号;然而,有趣的是,crontab中的定义是全局的。定义与cron命令混合的顺序似乎并不重要。FWIW我正在使用Vixie的cron,我可以定义我想要的任何变量。但是,无论顺序如何,这些变量的值都不会与其他变量值一起插值。例如:
FOO=${HOME}/FOO
不能像你期望的那样工作(它会让
“${HOME}”
逐字/不插入)。你能添加一个如何做的例子吗?
vi~/scripts/fun_stuff.sh chmod 700~/scripts/fun_stuff.sh crontab-e
fun_stuff.sh可以是你喜欢的任何shell脚本(例如:
#!/bin/bash a)=“绿色蔬菜”b=“很好吃。”m=“$a$b…不是“echo”$m”
)。然后,在crontab中添加一个条目以按计划运行它。嗯。不喜欢我的换行符。哦,好吧。经过这么长时间,我需要将其更新为正确答案,这显然是这样。我最初标记为正确的另一个答案,如果可以完成,真的不应该完成。
myvar=$(output of some complex command)
another='another
complex
variable'
42 17 * * * . $HOME/bin/myenv; path/to/command