基本上,我有一系列命令,我希望每隔一个星期天运行一次。我设置了一个cron任务来在每个星期天运行脚本,然后这个脚本只允许脚本在几周内运行,因此它只在每隔一个星期天运行。我的问题是,这个剧本每年都会继续发挥作用。
if [ $(($(date +'%U') % 2)) -eq 0 ]
then
some command
fi
答案 0 :(得分:2)
这里有the XY problem所谓的。{/ p>
您的shell脚本的这一部分存在问题,并且您希望通过修复脚本来解决问题。实际上,解决问题的根本原因更容易。
只需改变你的cron作业,每隔一个星期天运行一次:
#----+-----+-----+-----+-----+-------------------------------------------------
#min |hour |day |month|day |command
# | |of mn| |of wk|
#----+-----+-----+-----+-----+-------------------------------------------------
03 04 * * 7 expr `date +%W` % 2 >/dev/null || fortnightly.sh
有关详细信息,请参阅How to instruct cron to execute a job every second week?。
答案 1 :(得分:1)
如果您不想使用cron
语法指定此内容,则可以使用%s
格式代替%U
。这将为您提供自1970年1月1日UTC以来的秒数。您可以将其除以得到周数:
$(($(date +'%s') / 604800))
然后你可以对它进行模数测试。
请注意数字604800 = 7 * 86400 = 7 * 24 * 60 * 60
,即一周内的秒数。
如果你每天都在运行,你会想知道它实际上是一个星期天。所以在这种情况下,你将除以86400得到一个天数。然后,如果知道第零天是星期四,你可以检查结果(模14)是3还是10,这取决于你开始的星期天。