有没有办法安排 cron 作业每两周运行一次?
(我能想到的一种方法crontab
是在 中添加两个“日期”条目......)
答案1
不,cron 只知道星期几、一月中的哪一天和月份。
每月在固定日期(例如 1 日和 16 日)运行命令两次很容易:
42 4 1,16 * * do_stuff
每隔一周运行一次命令是另一回事。您能做的最好的事情就是每周运行一个命令,并让它每隔一周不执行任何操作。在 Linux 上,您可以将自纪元 ( ) 以来的秒数除以date +%s
一周的秒数,以获得每周翻转奇偶校验的数字。请注意,在 crontab 中,%
需要转义(cron%
在执行命令之前会变成换行符)。
42 4 * * 1 case $(($(date +\%s) / (60*60*24*7))) in *[02468]) do_stuff;; esac
答案2
您不能直接cron
每两周(每两周)运行一次作业。然而,确保作业的主要部分每隔一周运行一次是相当简单的。 @Gilles 提供了一种解决方案;这是另一个:
42 4 * * 1 test 1 -eq $(($(date +\%g) & 1)) && do_stuff...
该date +%g
命令返回当前周数(一年中的周数),并按位与运算返回 1 或 0,然后再用于确定是否可以运行实际作业。
对百分号符号的同样警告%
:在crontab
条目中必须对其进行转义,以防止cron
对其进行特殊处理。
答案3
我知道我参加聚会迟到了,但是,每个人都希望解决任何问题的一个或三个解决方案......
我发现这篇文章的同时想做与OP相同的事情,除了周日。
@user140906 有一个有效的关注点,可以在运行此代码片段时观察到;
for n in $(seq 17 33); do ncal -A1 -bw dec 20${n}; done
最初似乎每 6 年重复一次 - 我没有检查全部! :-)
然后我发现了这个关联它提供了两种解决方案,一种类似于@gilles-so-stop-being-evil,应该有效,最明显的一种如下;
#!/bin/bash
# a file marking the state on disk
mark_file=$HOME/.job-run-marker-1
# check whether the job run last time it is invoked
if [ -e $mark_file ] ; then
rm -f $mark_file
else
touch $mark_file
exit 0
fi
# job command is here
加上一个 crontab 条目,例如;
0 2 * * 2 my_script
轻松适应用于多个crontab
条目(传递一个值mark_file
或一个ID
而不是对其进行硬编码),或使用一些 // 魔法扩展相同的逻辑grep
,awk
以sed
在文件中添加/删除/附加表示 ID 和状态的行/每个作业执行的日期。
不管怎样,希望这对某人有帮助,甚至可能对未来的我有帮助!