如何在crontab中存储变量?我意识到这不是shell但是我想要一些常量,比如我的应用程序的路径或其他东西?
思想?
答案 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 command
在 var
的持续时间内将 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 by
sh`)和
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
这似乎就是你想要的。