是否可以在 crontab -e 中使用变量?

是否可以在 crontab -e 中使用变量?

我能说......么:

MYPATH=/root/scripts  
MYSCRIPT=doit.sh

0 1 * * * $MYPATH/$MYSCRIPT

crontab -e

是否可以在中使用变量crontab -e

答案1

是的,您可以用这种方式定义和使用变量。但有一个限制(您在示例中没有提到):符号右侧的字符串按=字面意思解释,前导空格被删除,因此您不能使用类似的构造FOO=$BAR/qux(例如,PATH=$HOME/bin:$PATH不会做任何有用的事情)。

文档中有说明,您可以通过运行来查看

man 5 crontab

(请注意,man crontab显示了crontab 命令,在手册的第 1 部分;你想要crontab 文件格式,见第 5 节。)

答案2

刚刚试了一下,是的,这是可能的。你可以用这个简单的例子来弄清楚,把它放在你的crontab

FOO=qwerty
* * * * * 回显 $FOO > ~/out

并检查文件~/out(每分钟更新一次),它应该包含"qwerty"

答案3

虽然 Linux crontabs 支持定义一些包含文字值的变量,但除了将长文本压缩为较短的表示或控制 cron 本身的某些内容(例如将电子邮件输出发送到何处)之外,它并没有多大用处。

灵活性在于了解 cron 条目的命令部分将传递给/bin/sh -c或使用 Vixie cron(通常安装在 Linux 系统上)的系统上定义的 shell SHELL。这意味着命令行的其余部分是一个简单的 shell 脚本。注意:了解正在使用的 shell。在 Linux 上,嵌入式命令/bin/sh通常/bin/bash有效$( ... ),但在较旧的系统上则不行,因为/bin/sh只有理解`

例如,我有一个简单的 crontab 行,每月存档一个保存的消息的 MBX 文件并对其进行压缩。它看起来像这样:

15 0 1 * *  nf=MailFeed-$( date +\%Y\%m ).mbx && cd Logs && mv MailFeed.mbx $nf && bzip2 -9 $nf

这将在每个月第一天的凌晨 12:15 运行,设置一个包含 CCYYMM 的新文件名,将当前文件移动到新名称并压缩。要记住的是,未转义的%(百分号)将被视为换行符,其后的数据将作为标准输入发送到百分号之前的命令。这就是为什么正常date +Y+m写法如上date +\%Y\%m的原因。

答案4

是的,在 cron 中使用环境变量是完全可能的:

您可以将/bin/bash外壳设置在里面crontab以解决难题:

(我假设您正在处理您的用户 crontab。)

$ crontab -e

在顶部添加此行:

SHELL=/bin/bash

至于命令,您现在可以在 bash 交互模式下运行脚本或命令(例如,对于您的情况 - 请注意开关-ici用于“交互式”,允许读取您的配置文件环境变量):

* * * * * bash -ic "(echo \"USING TOKEN $GITTOKEN\" >> /var/log/custom-cron.log 2>&1)"

使用 保存Ctrl+O。使用 退出Ctrl+X

如果您有一个使用用户环境变量的 bash 脚本,则 cron 行将变成如下所示(我的示例每 15 分钟运行一次):

*/15 9-15 * * 1-5 bash -ic "($HOME/.config/conky/scripts/stocks >> $HOME/.local/log/stocks.log 2>&1)" &

相关内容