如何安排每个月的第一个星期天

rin*_*rer 51 bash shell cron redhat

我在RedHat上使用Bash.我需要安排一个cron工作在每个月的第一个星期日上午9点运行.我怎样才能做到这一点?

Luk*_*ach 133

你可以把这样的东西放在crontab文件中:

00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script
Run Code Online (Sandbox Code Playgroud)

date +%d给你当天的号码,然后你可以检查,如果这一天是小于或等于7.如果是这样,运行命令.

如果仅在星期日运行此脚本,则应表示它仅在该月的第一个星期日运行.

请记住,在crontab文件中,date应该转义命令的格式选项.


Pēt*_*une 13

有一种巧妙的方法可以使用经典的(Vixie、Debian)cron 来做到这一点:

\n
0 9 1-7 * */7\n
Run Code Online (Sandbox Code Playgroud)\n

星期字段以星号 ( *) 开头,因此 cron 认为它“不受限制”,并在月份字段和星期字段之间使用 AND 逻辑。

\n

*/7表示“从工作日 0(星期日)开始每 7 天”。实际上,这意味着“每个星期日”。

\n

这是我的文章,其中包含更多详细信息:Schedule Cronjob for the First Monday of Every Month, the Funky Way

\n

注意 \xe2\x80\x93 这是一个 hack。如果您使用此表达式,请确保将其记录下来以避免以后混淆。

\n

  • 这应该是公认的答案。只需使用 cron,无需额外的脚本。作为额外的好处,这是唯一也适用于在 Jenkins 中安排每月作业的解决方案。 (2认同)
  • 如果本机 cron 允许的话,这不是黑客行为。 (2认同)

Dir*_*tel 12

您需要结合两种方法:

a)用于cron每周日上午9:00开始工作.

 00 09 * * 7     /usr/local/bin/once_a_week
Run Code Online (Sandbox Code Playgroud)

b)在开始时once_a_week,计算日期并通过shell,Python,C/C++,...和1到7之间的测试来提取月份的日期.如果是这样,执行真实的脚本; 如果没有,请默默退出.


Mar*_*ery 9

值得一提的是,是什么样子的最显而易见的方法解决这个问题确实工作。

您可能以为您可以编写一个crontab条目,将星期几指定为0(代表星期日),将星期几指定为1-7,就像这样……

# This does NOT work.
0 9 1-7 * 0 /path/to/your/script
Run Code Online (Sandbox Code Playgroud)

...但是,由于Cron处理指定了星期几和星期几的crontab行的方式有些怪异,因此无法使用,实际上会在第1、2、3日运行, 4日,5日,6日和本月7日(不管它们是什么星期几),并一个月的星期天。

这就是为什么您会看到建议使用[ ... ]check with date设置这样的规则的原因-在crontab中指定星期几,并使用[and date在运行以下命令之前检查星期几是否小于等于7。脚本,如接受的答案所示,或在crontab 中指定星期几的范围,并使用[date检查运行前的星期几,如下所示:

# This DOES work.
0 9 1-7 * * [ $(date +\%u) = 7 ] && /path/to/your/script
Run Code Online (Sandbox Code Playgroud)

如果您想确保crontab行不管在什么操作系统上使用都可以工作,请记住一些最佳做法:

  • 使用=而不是==进行比较。因为不是所有的shell都使用[支持==操作员的实现,所以它更加可移植。
  • 使用说明%u符来date获取星期几(而不是%a运算符)作为数字,因为%a根据date运行的语言环境得出不同的结果。
  • 只需使用date,不使用/bin/date/usr/bin/date,因为该date实用程序在不同系统上的位置不同。

  • 此方法每月触发检查 7 次,其中 6 次不执行任何操作。每个星期日检查该天是否最多为 7 点的方法每月会触发检查 4 到 5 次,其中 3 到 4 次不执行任何操作。所以后面的方法效率更高一些。另外,它只会在周日触发,此时您可以更轻松地承担开销。承认,这在实践中可能没有任何区别...... (2认同)

the*_*ets 5

一个hacky解决方案:让你的cron作业每周日运行,但让你的脚本在启动时检查日期,如果月份的日期> 7则立即退出...


小智 5

这也适用于工作日的名称:

0 0 1-7 * * [ "$(date '+\%a')" == "Sun" ] && /usr/local/bin/urscript.sh
Run Code Online (Sandbox Code Playgroud)

但,

[ "$(date '+\%a')" == "Sun" ] && echo SUNDAY

由于 crontab 中对“%”的特殊处理,命令行将失败(也适用于/sf/answers/226951861/


MGP*_*MGP 5

在第一个星期一,第三个星期二,最后一个星期日执行一次cron任务。

http://xr09.github.io/cron-last-sunday/

只需将run-if-today脚本放在路径中,然后与cron一起使用即可。

30 6 * * 6 root run-if-today 1 Sat && /root/myfirstsaturdaybackup.sh
Run Code Online (Sandbox Code Playgroud)

run-if-today如果是正确的日期,脚本将仅返回0(bash值为True)。

编辑:

现在有了更简单的界面,星期数只需一个参数。

# run every first saturday
30 6 * * 6 root run-if-today 1 && /root/myfirstsaturdaybackup.sh

# run every last sunday
30 6 * * 7 root run-if-today L && /root/lastsunday.sh
Run Code Online (Sandbox Code Playgroud)