是否可以安排 cron 作业每两周运行一次?

是否可以安排 cron 作业每两周运行一次?

有没有办法安排 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而不是对其进行硬编码),或使用一些 // 魔法扩展相同的逻辑grepawksed在文件中添加/删除/附加表示 ID 和状态的行/每个作业执行的日期。

不管怎样,希望这对某人有帮助,甚至可能对未来的我有帮助!

相关内容