基本上,我有一系列命令,我想每隔一个星期天运行一次。我设置了一个 cron 任务来每周日运行脚本,然后这个脚本只允许脚本在偶数周运行,因此它每隔一个星期天运行一次。我的问题是,这个脚本还会年复一年地工作吗?
if [ $(($(date +'%U') % 2)) -eq 0 ]
then
some command
fi
这里有所谓的XY 问题。
您的 shell 脚本的这一部分有问题,您想通过修复脚本来解决问题。实际上,解决问题的根本原因更容易。
只需将您的 cron 作业更改为每隔一个星期日运行一次:
#----+-----+-----+-----+-----+-------------------------------------------------
#min |hour |day |month|day |command
# | |of mn| |of wk|
#----+-----+-----+-----+-----+-------------------------------------------------
03 04 * * 7 expr `date +%W` % 2 >/dev/null || fortnightly.sh
请参阅如何指示 cron 每两周执行一次作业?了解更多信息。
如果您不想用cron
语法指定它,您可以使用%s
格式而不是%U
. 这将为您提供自 1970 年 1 月 1 日 UTC 以来的秒数。您可以将其划分为周数:
$(($(date +'%s') / 604800))
然后你可以对它进行模数测试。
注意数字,604800 = 7 * 86400 = 7 * 24 * 60 * 60
即一周内的秒数。
如果你每天都运行这个,你会想知道它实际上是一个星期天。因此,在这种情况下,您将除以 86400 以获得日期数。然后,在知道第 0 天是星期四的情况下,您可以检查结果(模 14)是 3 还是 10,具体取决于您从哪个星期日开始。