dmk*_*lls 13 scripting bash cron
我已经对如何做到这一点进行了大量研究,我发现 cron 中没有直接的方法来运行工作,比如每隔一个星期四。
现在,我倾向于制作一个每周只运行一次的脚本,并且在它运行时会触摸一个“标志”文件,如果它运行并且文件已经存在,则删除该文件(而不是执行双周行动)。
我的问题是,是否有其他更优雅或更简单的方法来实现每隔一周自动运行一次 bash 操作脚本的目标?
谢谢!
小智 11
0 0 * * Thu bash -c '(($(date +\%s) / 86400 \% 14))' && your-script
Run Code Online (Sandbox Code Playgroud)
我用 bash 来做我的数学,因为我很懒;将其切换为您喜欢的任何内容。我利用 1970 年 1 月 1 日是星期四;对于一周中的其他几天,您必须应用偏移量。Cron 需要转义百分号。
快速检查:
function check {
when=$(date --date="$1 $(($RANDOM % 24)):$(($RANDOM % 60))" --utc)
echo -n "$when: "
(($(date +%s --date="$when") / 86400 % 14)) && echo run || echo skip
}
for start in "2010-12-02" "2011-12-01"; do
for x in $(seq 0 12); do
check "$start + $(($x * 7)) days"
done
echo
done
Run Code Online (Sandbox Code Playgroud)
注意我选择了随机时间来表明如果在星期四的任何时间运行,这将起作用,并选择跨越年份界限的日期加上包含 4 和 5 个星期四的月份。
输出:
Thu Dec 2 06:19:00 UTC 2010: run
Thu Dec 9 23:04:00 UTC 2010: skip
Thu Dec 16 05:37:00 UTC 2010: run
Thu Dec 23 12:49:00 UTC 2010: skip
Thu Dec 30 03:59:00 UTC 2010: run
Thu Jan 6 11:29:00 UTC 2011: skip
Thu Jan 13 13:23:00 UTC 2011: run
Thu Jan 20 20:33:00 UTC 2011: skip
Thu Jan 27 16:48:00 UTC 2011: run
Thu Feb 3 17:43:00 UTC 2011: skip
Thu Feb 10 05:49:00 UTC 2011: run
Thu Feb 17 08:46:00 UTC 2011: skip
Thu Feb 24 06:50:00 UTC 2011: run
Thu Dec 1 21:40:00 UTC 2011: run
Thu Dec 8 23:24:00 UTC 2011: skip
Thu Dec 15 22:27:00 UTC 2011: run
Thu Dec 22 02:47:00 UTC 2011: skip
Thu Dec 29 12:44:00 UTC 2011: run
Thu Jan 5 17:59:00 UTC 2012: skip
Thu Jan 12 18:31:00 UTC 2012: run
Thu Jan 19 04:51:00 UTC 2012: skip
Thu Jan 26 08:02:00 UTC 2012: run
Thu Feb 2 17:37:00 UTC 2012: skip
Thu Feb 9 14:08:00 UTC 2012: run
Thu Feb 16 18:50:00 UTC 2012: skip
Thu Feb 23 15:52:00 UTC 2012: run
Run Code Online (Sandbox Code Playgroud)
at
如果您运行的是 Linux,一种方法可能是使用该实用程序。您可以将其放在脚本的末尾:
at X + 2 weeks -f myscript
Run Code Online (Sandbox Code Playgroud)
其中X是您想要运行脚本的时间。初始化只是at
在你想第一次运行它的时候调用,然后上面的语句不断更新你的预定调用。