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