每隔一周通过 cron 运行一个脚本

每隔一周通过 cron 运行一个脚本

我已经对如何执行此操作进行了大量研究,并且我发现 cron 中没有直接的方法来运行作业,例如每隔星期四运行一次。

现在,我倾向于制作一个可以运行的脚本每一个周,并且在运行时会触摸“标志”文件,如果它运行并且文件已经存在,则删除该文件(并且不执行每两周一次的操作)。

我的问题是,是否有其他更优雅或更简单的方法来实现每隔一周自动运行一次 bash 操作脚本的目标?

谢谢!

答案1

0 0 * * Thu bash -c '(($(date +\%s) / 86400 \% 14))' && your-script

我用 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

请注意,我选择了随机时间来表明如果在星期四的任何时间运行,该方法都可以工作,并且选择了跨年度边界的日期,并且包括同时具有 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

答案2

at如果您运行的是 Linux,一种方法可能是使用该实用程序。您可以将其放在脚本的末尾:

at X + 2 weeks -f myscript

在哪里X是您要运行脚本的时间。要初始化,只需调用at您想要第一次运行它的时间,然后上述语句就会不断更新您的计划调用。

答案3

如果你可以使用anacron在系统上,事情就会简单得多。要使用anacron您必须安装它并且您必须具有 root 访问权限。它不适用于旧系统(即 RHEL 5.x),旧版本的 ancron 仅在启动时运行。它确实适用于较新的系统(即 RHEL 6.x)。

通过anacron,我们可以以更灵活的方式安排作业,例如每周运行一次 X 作业。当计算机可用时也anacron运行作业,即您不必考虑系统何时启动或关闭。

要每隔一周运行一个脚本,您必须在 /etc/anacrontab 中添加类似于以下内容的行:

14 5 myScript script.sh

查看手册页了解详细信息。

答案4

我不确定是否有更优雅的方式来定义每隔一周,但这可能对您有用。

00 06 1-7,15-21 * * test `date +\%a` = Thu && /path/to/script

这将在该月的第一个和第三个星期四的早上 6:00 启动脚本。

相关内容