Bash Crontab计划每两周一次
本周我的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 *
它的设置如下,到目前为止每两周正常工作一次
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