在占位符中存储 crontab 子表达式

Storing crontab sub-expressions in a placeholder

我们知道 cron table(或 crontab)中的项目具有以下格式。

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday)
# * * * * * <command to execute>

有时,我需要通过更改某些子表达式中的值来进行快速更改,例如在 several[=39 中的“小时”子表达式中将 7 改为 8 =]行。

有没有办法将此值存储在占位符中,这样我就不必手动修改 cron table 中的许多行?

例子

例如,我想在这样的占位符中存储一个值:

var wakeup=7

或者像这样:

const wakeup=7

或者使用一些类似宏的命令,像这样:

#define wakeup 7

这样我就可以编写如下所示的 crontab 行:

 0 wakeup * * * wakeupscript.sh
...
...
*/5 0-wakeup * * * prewakeupchecks.sh

这样当我希望这些脚本分别在 8 点和 8 点之前 运行,而不是在 7 点和 7 点之前,我只需要重新定义 wakeup 占位符而不是手动更改所有行。

理想情况下,占位符还应存储间隔和频率值,如 15-30*/20

据我所知,对于常见的 cron 实现,简单的答案是“否”。

crontab文件格式非常简单,解释时没有展开任何变量和宏。在某些实现中,可以设置环境变量来影响 cron 本身的行为,并在执行时传递给命令,但这些不会影响文件其他行的解释。

您可以改为构建自己的宏/模板系统:

  • 以自定义格式存储规则
  • 写一个脚本将它们预处理成标准的crontab格式并输出到一个临时文件
  • 使用 crontab $tempfile
  • 将其安装为 crontab

预处理器甚至可以是通用的,例如 M4、Perl、PHP,甚至 handlebars.js。您所要做的就是记住不要手动编辑 crontab,这样它就会与您的模板不同步。