crontab中的变量?

时间:2010-09-03 20:36:01

标签: cron

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

思想?

6 个答案:

答案 0 :(得分:79)

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

VARIABLE=value
PATH=/bin:/path/to/doathing
0 0 * * * doathing.sh $VARIABLE

手册页说:

  

crontab中的活动行将是环境设置或cron命令。环境设置的格式为

     name = value
     

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

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

答案 1 :(得分:2)

您可以将环境变量放在crontab中。有关详细信息,请参阅crontab(5)的手册页。

答案 2 :(得分:1)

只是一个在 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):

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"]

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

/usr/bin/docker exec container_name ls -la

答案 3 :(得分:1)

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

42 17 * * * myvariable='value' path/to/command

如果不明显,sh 语法 var=value commandvar 的持续时间内将 value 设置为 command。如果您需要多个,您可以拥有多个。

42 17 * * * firstname='Fred` lastname='Muggs' path/to/command

如果您想从多个位置访问重要变量,可能会将它们放在一个单独的文件中,并从您的 shell 启动脚本和您的 . 作业中获取 (cron) 该文件。< /p>

假设您有一个文件 $HOME/bin/myenv,其设置类似于

myvar=$(output of some complex command)
another='another
complex
variable'

然后你可以添加

. $HOME/bin/myenv

到您的 .profile(或 .zshrc.bash_profile or what have you; but .profileis portable, and also used bysh`)和

42 17 * * * . $HOME/bin/myenv; path/to/command

在您的 crontab 中。

注意文件名前空格前的单点;这是点命令(在例如 Bash 中也称为 source),它将文件读入当前 shell 实例,就像您在此处输入文件中的内容一样。

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:-8)

我不是一个unix家伙,所以我不能说任何明确的,但这听起来像是一个预处理器步骤的好地方。

#define cmdpath /usr/bin/myfolder/cmd
0,30 8-17 * * 1-5 cmdpath
17 3 * * 1 cmdpath

通过我的c ++编译器的预处理器运行它给出:

0,30 8-17 * * 1-5 /usr/bin/myfolder/cmd
17 3 * * 1 /usr/bin/myfolder/cmd

这似乎就是你想要的。