如何安排Cron作业在一年的第4周运行
收藏

我在一个应用程序上工作,该应用程序使用本机unix cron选项卡来安排作业。参数说明如下:

Minute, Hour, Da_of_Week(1-7, 1=Sun), Day_of_Month(1-31), Day_of_Year(1-365), Week (1-52), Month (1-12) 

我想在一年的第一周的星期一晚上8点做一份工作,但我不知道如何确定这周什么时候开始。2017年12月31日至2018年1月6日是第一周还是2018年1月7日至13日是第一周?


最佳答案:

在特定的周数上运行cron作业并不容易
因为一切都取决于你对周数的定义
也用过。
欧洲(ISO 8601)
这个ISO 8601 standard在世界上被广泛使用:欧盟和大多数其他国家
欧洲国家、亚洲大部分地区和大洋洲
ISO 8601标准规定如下:
一周有七天
一周的第一天是星期一
第一周是一年中包含
星期四。这意味着这是4天或更长时间的第一周
一月份。
有了这个定义,就有可能有一个第53周。这些发生在一月一日
星期五(如2016-01-01、2010-01-01)。或者,如果前一年是
闰年,也是星期六。(例如2005-01-01)

   December 2015               January 2016        
 Mo Tu We Th Fr Sa Su CW    Mo Tu We Th Fr Sa Su CW
     1  2  3  4  5  6 49                 1  2  3 53
  7  8  9 10 11 12 13 50     4  5  6  7  8  9 10 01
 14 15 16 17 18 19 20 51    11 12 13 14 15 16 17 02
 21 22 23 24 25 26 27 52    18 19 20 21 22 23 24 03
 28 29 30 31          53    25 26 27 28 29 30 31 04

美国或伊斯兰(非ISO 8601)
并非所有国家都使用ISO 8601系统。他们使用更为绝对的方法。
在加拿大,美国,新西兰,印度,日本,…
伊斯兰制度在中东普遍使用。
两种系统都非常相似。
美国人:
一周有七天
一周的第一天是星期天
第一周从一月一日开始
伊斯兰:
一周有七天
一周的第一天是星期六
第一周从一月一日开始
根据这些定义,可以在
一年的开始和结束。因此第一周和最后一周
年份不能包含所有工作日。
American:

    December 2015                January 2016       
 Su Mo Tu We Th Fr Sa CW     Su Mo Tu We Th Fr Sa CW
        1  2  3  4  5 49                     1  2 01
  6  7  8  9 10 11 12 50      3  4  5  6  7  8  9 02
 13 14 15 16 17 18 19 51     10 11 12 13 14 15 16 03
 20 21 22 23 24 25 26 52     17 18 19 20 21 22 23 04
 27 28 29 30 31       53     24 25 26 27 28 29 30 05
                             31                   06

Islamic:

   December 2015                 January 2016       
 Sa Su Mo Tu We Th Fr CW     Sa Su Mo Tu We Th Fr CW
           1  2  3  4 49                        1 01
  5  6  7  8  9 10 11 50      2  3  4  5  6  7  8 02
 12 13 14 15 16 17 18 51      9 10 11 12 13 14 15 03
 19 20 21 22 23 24 25 52     16 17 18 19 20 21 22 04
 26 27 28 29 30 31    53     23 24 25 26 27 28 29 05
                             30 31                06

注意:对于您尝试执行的任务,这可能特别麻烦
表演。尤其是在第一个星期一
一周。这个星期一可能不存在。
在cron中导入这个
不能直接将这些系统添加到cron中。这个
周测试应通过表格的条件测试来完成
weektestcmd weeknr && cmd

如果cronjob只在一年中的第4周的星期一系统时间20:00运行(根据操作请求),那么crontab将显示为:
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *   command to be executed
  0 20  *  *  1   weektestcmd 4 && cmd

weektestcmd定义为
ISO 8601周数:
#!/usr/bin/env bash
[[ $(date '+%V') -eq $1 ]]

美国日历周编号:
#!/usr/bin/env bash
# obtain the day of year
doy=$(date "+%j")
# compute the week offset of the first of January
## compute the day of the week with Mo=1 .. Su=7
offset=$(date -d $(date "+%Y")-01-01 "+%u")
## Take the modulo for the offset as Su=0
offset=$(( offset%7 ))
# Compute the current week number
cw=$(( (doy + offset + 6)/7 ))
[[ $cw -eq $1 ]]

伊斯兰日历周编号:
#!/usr/bin/env bash
# obtain the day of year
doy=$(date "+%j")
# compute the week offset of the first of January
## compute the day of the week with Mo=1 .. Su=7
offset=$(date -d $(date "+%Y")-01-01 "+%u")
## Take the modulo for the offset as Sa=0
offset=$(( (offset + 1)%7 ))
# Compute the current week number
cw=$(( (doy + offset + 6)/7 ))
[[ $cw -eq $1 ]]

注:请注意,在美国和伊斯兰体系中,第一周可能没有星期一。
注意:还有其他定义周数的方法。尽管如此,方法还是一样。定义一个检查周数的脚本并在cron中使用它。

    公众号
    关注公众号订阅更多技术干货!