Bash Crontab计划每两周一次

Bash Crontab计划每两周一次,bash,crontab,Bash,Crontab,本周我的crontab工作中出现了一个问题。 它的设置如下,到目前为止每两周正常工作一次 10 06 * * 1 test $(($(date +\%W)\%2)) -eq 0 && echo 'test' > /tmp/test.log 问题是 $($(日期+\%W)\%2))将是08,而不是2月份的7 如果您在bash中运行,它将显示错误消息:value对于base来说太大(错误标记为“08”)。 当我试图修改它以强制使用十进制基数时,也不起作用: 10 06 *

本周我的crontab工作中出现了一个问题。
它的设置如下,到目前为止每两周正常工作一次

10 06 * * 1 test $(($(date +\%W)\%2)) -eq 0 && echo 'test' > /tmp/test.log
问题是

$($(日期+\%W)\%2))将是08,而不是2月份的7

如果您在bash中运行,它将显示错误消息:value对于base来说太大(错误标记为“08”)。

当我试图修改它以强制使用十进制基数时,也不起作用

10 06 * * 1 test $((10#$(date +\%W)\%2)) -eq 0 && echo 'test' > /tmp/test.log

有人知道如何解决这个问题吗<非常感谢。

每两周午夜

   0 0 */15 * * echo 'test'  > tmp.txt


Your cron job will be run at: (5 times displayed)

2016-03-15 00:00:00 UTC
2016-03-30 00:00:00 UTC
2016-04-15 00:00:00 UTC
2016-04-30 00:00:00 UTC
2016-05-15 00:00:00 UTC
在脚本中创建条件 crontab中不鼓励使用
%
符号

为了确保jod在周一开始,最好每两周创建一个小脚本

#!/bin/bash

if [ "$1" == "-f" ] ;then # use "-f" switch to force execution on odd weeks
    shift
else
    printf -v d '%(%W)T' -1
    ((10#$d%2)) || exit 0  # stop here if odd week
fi

printf "Real job begin at %(%c)T, there...\n" -1
这可以缩短为一行:

#!/bin/bash
[ "$1" == "-f" ]&&shift||{ printf -v d '%(%W)T' -1;((10#$d%2))||exit;}
因此,您可以在crontab中添加标准行:

10 06 * * 1 path/to/myScript > /tmp/test.log
样本:2016年 与每月使用15日和30日的想法相比:


正如你所看到的,每周有一次手术失误:6、9、10、21、32和45。一年内至少少做3次手术。

这不能保证每两周按要求进行一次!参见我的回答这里的问题是
+%W
日期
输出中填充零,该输出被翻译为八进制数字。将其替换为
+%-W
,以防止零填充。示例:
date+%W
输出
08
,而
date+%W
输出
8
。第一个输出假定为八进制,第二个输出假定为十进制。语法
$(…)
10#…
是bashism<代码>bash特定功能
cron
不是
bash
。这就是为什么你更喜欢自己编写脚本的原因之一。谢谢大家!按照阿尔维茨的建议,它工作正常。在日期手册页中,它显示:“默认情况下,日期填充数字字段为零。以下选项标志可能跟在%”后面,包括连字符(不填充字段)。嗨,Hauri,你的脚本可以控制比我所做的更多的细节,这太神奇了!但是理解代码是我的弱点,你能解释一下吗?1.日期-d 2016-1-4\10:06+%s-->为什么需要反斜杠来避免错误?2.下面的代码只有我知道是printf-v和variable,$()存储变量。printf-vd%%(%W)T'$((c=i*7*86400+1451898360))((10#$d%2))&&printf“%(%a%d%b,周:%W)T\n“$c谢谢..1:crontab使用
%
对于命令结束选项卡,请使用rtfm:
manpless\+/%5 crontab
.1b:(和)使用空格在输入行拆分参数<代码>日期-d 2016-1-4\10:06+%s可以写成:
日期-d'2016-1-4 10:06'+%s
。2:语法
a=$(cmd args)
将使用参数
args
执行
cmd
,并将stantard输出存储到变量
$a
。语法
b=$((3*5))
将计算(整数数学)并将结果存储到变量
$b
.2b:
printf“%(%a%d%b,%T)T\n”-1
将打印当前日期和时间。用整数代替
-1
,这将打印1970年1月1日
的时间+秒数
date -d 2016-1-4\ 10:06  +%s
1451898360
for i in {0..52};do
    printf -v d '%(%W)T' $((c=i*7*86400+1451898360))
    ((10#$d%2)) && printf "%(%a %d %b, week: %W)T\n" $c
  done | cat -n
     1  Mon 04 Jan, week: 01
     2  Mon 18 Jan, week: 03
     3  Mon 01 Feb, week: 05
     4  Mon 15 Feb, week: 07
     5  Mon 29 Feb, week: 09
     6  Mon 14 Mar, week: 11
     7  Mon 28 Mar, week: 13
     8  Mon 11 Apr, week: 15
     9  Mon 25 Apr, week: 17
    10  Mon 09 May, week: 19
    11  Mon 23 May, week: 21
    12  Mon 06 Jun, week: 23
    13  Mon 20 Jun, week: 25
    14  Mon 04 Jul, week: 27
    15  Mon 18 Jul, week: 29
    16  Mon 01 Aug, week: 31
    17  Mon 15 Aug, week: 33
    18  Mon 29 Aug, week: 35
    19  Mon 12 Sep, week: 37
    20  Mon 26 Sep, week: 39
    21  Mon 10 Oct, week: 41
    22  Mon 24 Oct, week: 43
    23  Mon 07 Nov, week: 45
    24  Mon 21 Nov, week: 47
    25  Mon 05 Dec, week: 49
    26  Mon 19 Dec, week: 51
    27  Mon 02 Jan, week: 01
for i in {1..12}/{15,30};do
    date -d '2016/'$i +'%a %d %b, week: %W' 2>/dev/null
  done | cat -n
 1  Fri 15 Jan, week: 02
 2  Sat 30 Jan, week: 04
 3  Mon 15 Feb, week: 07
 4  Tue 15 Mar, week: 11
 5  Wed 30 Mar, week: 13
 6  Fri 15 Apr, week: 15
 7  Sat 30 Apr, week: 17
 8  Sun 15 May, week: 19
 9  Mon 30 May, week: 22
10  Wed 15 Jun, week: 24
11  Thu 30 Jun, week: 26
12  Fri 15 Jul, week: 28
13  Sat 30 Jul, week: 30
14  Mon 15 Aug, week: 33
15  Tue 30 Aug, week: 35
16  Thu 15 Sep, week: 37
17  Fri 30 Sep, week: 39
18  Sat 15 Oct, week: 41
19  Sun 30 Oct, week: 43
20  Tue 15 Nov, week: 46
21  Wed 30 Nov, week: 48
22  Thu 15 Dec, week: 50
23  Fri 30 Dec, week: 52