这段代码会在新的一年里发挥作用吗?

时间:2013-05-02 02:33:53

标签: shell cron

基本上,我有一系列命令,我希望每隔一个星期天运行一次。我设置了一个cron任务来在每个星期天运行脚本,然后这个脚本只允许脚本在几周内运行,因此它只在每隔一个星期天运行。我的问题是,这个剧本每年都会继续发挥作用。

if [ $(($(date +'%U') % 2)) -eq 0 ]
then
  some command
fi

2 个答案:

答案 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,这取决于你开始的星期天。