如何在 crontab 条目中使用变量?

问题描述 投票:0回答:5

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

cron
5个回答
87
投票

在可能是最常见的 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 运行该脚本。事实上,对于任何复杂的事情来说,这是一件好事。


19
投票

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


12
投票

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

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

所以:

var1 = bar
var2 = foo${var1}
42 17 * * * /path/to/command ${var2}

结果:

/path/to/command foo${var1}

同时:

var1 = bar
var2 = foo
42 17 * * * /path/to/command ${var2}${var1}

结果:

/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

类似这样的诗句不起作用:

logfile = /my/log/dir/myfile_${timestamp}.log

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


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"

在此 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
投票

如果您想为特定作业设置一些环境变量,只需将它们内联到

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
) 该文件。

假设您有一个文件

$HOME/bin/myenv
,其设置如下

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

然后你可以添加

. $HOME/bin/myenv

到您的

.profile
(或
.zshrc
.bash_profile
或其他什么;但
.profile
是便携式的,也由
sh
使用)和

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

在你的

crontab

注意文件名前空格前的孤点;这是点命令(在 Bash 中也称为

source
),它将文件读入当前 shell 实例,就像您在此处输入文件中的内容一样。

切向来说,

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

显然,如果您希望在整个

crontab
中设置变量,请将其设置在顶部、计划作业之前。

© www.soinside.com 2019 - 2024. All rights reserved.