我目前正在写一篇关于 cron 的文章,针对那些熟悉该工具但不一定经常使用它的人。我希望这些示例与目前使用的大多数常见 Unix 桌面兼容(2002 年后的 linux、bsd、osx)。
在寻找“每月最后一天”的 cron 表达式时,我发现的大多数建议都建议使用从每月 28 日到 31 日运行的 cron 表达式与包含布尔日期比较的命令的组合。
TODAY=`date +%m` # Computes the month for today (01-12)
TOMORROW=`date --date=tomorrow +%m` # Computes the month for tomorrow (01-12)
0 0 28-31 * * [$TODAY -lt $TOMORROW] && command
这似乎是一个流行的 Unix 技巧。我最近偶然发现了这一点维基百科文章关于 Cron Expressions 的文章讨论了一些我从未在其他地方(甚至手册页中)看到过的字符。根据文章,L 字符可用于表达式中以指定月份(或星期)的最后一天。
哪个版本的 cron 支持此功能?它受到多广泛的支持?为什么它如此鲜为人知?
答案1
我不知道 L 语法,但在 BSD 上,您可以使用:
string meaning
------ -------
@reboot Run once, at cron(8) startup.
@yearly Run every January 1, "0 0 1 1 *".
@annually (same as @yearly).
@monthly Run the first day of every month, "0 0 1 * *".
@weekly Run every Sunday, "0 0 * * 0".
@daily Run every midnight, "0 0 * * *".
@midnight (same as @daily).
@hourly Run every hour, on the hour, "0 * * * *".
但这也不是标准...
答案2
我从未听说过这种L
构造,它肯定不是我所知道的标准(根据手册页和一些经验测试,它肯定不在 Vixie cron 中)。
我不会指望它除了在那台孤独的维基百科机器上之外还能工作,我建议使用你在问题中描述的方法,它几乎在任何地方都有效。