Bash 如何安排每个月的第一个星期日运行

Bash 如何安排每个月的第一个星期日运行,bash,shell,cron,redhat,Bash,Shell,Cron,Redhat,我正在RedHat上使用Bash。我需要安排一个cron作业在每个月的第一个星期日上午9:00运行。如何执行此操作?可能使用cron.hourly调用另一个脚本。然后,该脚本将检查是否是本月的第一个星期日和上午9点,如果是,请运行您的程序。对我来说,这听起来很理想:-)。一个黑客解决方案:让你的cron作业每周日运行一次,但让你的脚本在开始时检查日期,如果一个月的日期>7,就立即退出…你需要结合两种方法: a) 使用cron在每个周日上午9:00运行作业 00 09 * * 7 /us

我正在RedHat上使用Bash。我需要安排一个cron作业在每个月的第一个星期日上午9:00运行。如何执行此操作?

可能使用cron.hourly调用另一个脚本。然后,该脚本将检查是否是本月的第一个星期日和上午9点,如果是,请运行您的程序。对我来说,这听起来很理想:-)。

一个黑客解决方案:让你的cron作业每周日运行一次,但让你的脚本在开始时检查日期,如果一个月的日期>7,就立即退出…

你需要结合两种方法:

a) 使用
cron
在每个周日上午9:00运行作业

 00 09 * * 7     /usr/local/bin/once_a_week

b) 在每周一次的
开始时,通过shell、Python、C/C++、。。。测试范围为1到7(含1到7)。如果是,执行真实脚本;如果没有,则静默退出。

您可以在
crontab
文件中放置类似的内容:

00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script
日期+%d
为您提供当前日期的编号,然后您可以检查该日期是否小于或等于7。如果是,请运行您的命令

如果仅在星期日运行此脚本,则应意味着它仅在每月的第一个星期日运行


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

如果您不希望cron每天或每个星期天运行作业,您可以编写一个将运行代码的包装器,确定下一个第一个星期天,并安排自己在该日期运行

然后把包装纸安排在这个月的下一个第一个星期天。之后,它将自行处理一切

代码应该是这样的(强调某些东西…没有进行错误检查):

#/bin/bash
#我们先运行你的代码
/路径/到/您的/代码
#现在我们发现第二天我们想跑步
nskip=28#我们希望检查未来的天数
curr_month=`date+%m“`
new_month=`date--date='$nskip days'+%m“`
如果[[当前月份=新月份]]
然后
((nskip+=7))
fi
date=`date--date='$nskip days'+“09:00AM%D`#如果使用其他计划程序,可能需要更改格式
#使用“at”计划作业
at-m$日期
找到下一个第一个星期日的逻辑很简单。因为我们从当月的第一个星期日开始,加上28将把我们放在当月的最后一个星期日或下个月的第一个星期日。如果是当月,我们将增加到下一个星期日(将在下个月的第一周)


我使用了“at”。我不知道这是否是作弊。不过主要的想法是找到下一个第一个星期天。在那之后,你可以替换任何你想要的调度程序,因为你知道你想要运行作业的日期和时间(不过,不同的调度程序可能需要不同的日期语法).

00 09 1-7*0/usr/local/bin/每周一次


每月前7天的每个星期日,这也适用于工作日的名称:

0 0 1-7 * * [ "$(date '+\%a')" == "Sun" ] && /usr/local/bin/urscript.sh
但是,

[“$(日期'+\%a')”==“太阳”]&&echo SUNDAY


由于在crontab中对“%”进行了特殊处理,将在comandline上失败(同样适用于)

运行cron任务第一个星期一、第三个星期二、上星期天,任何情况

只需将
runif today
脚本放在路径中,并与cron一起使用即可

30 6 * * 6 root run-if-today 1 Sat && /root/myfirstsaturdaybackup.sh
如果是正确的日期,
runif 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
试试下面的方法

0 15 10?*1#1


值得注意的是,解决这个问题最明显的方法是行不通的

您可能认为可以编写一个crontab条目,将一周中的某一天指定为0(对于星期日),将一个月中的某一天指定为1-7,如下所示

# This does NOT work.
0 9 1-7 * 0 /path/to/your/script
…但是,由于,这将不起作用,事实上,它将在每月的第一、第二、第三、第四、第五、第六和第七天(无论是星期几)以及每月的每个星期日运行


这就是为什么建议使用
[…]
检查
日期
设置这样一个规则-在crontab中指定星期几,并使用和检查月日是否为例外,您不妨将其称为“每日”:这是一个鲜为人知的事实,每天更改一次。;)感谢您的回答,虽然不是什么大问题,但为什么要每小时运行一次脚本?我很想在每个星期天运行一个每周脚本。但是想知道是否有人已经做过类似的事情。我在cron没有经验,这就是为什么,可能有更好的方法。但是每小时轮询一次你的条件脚本会让你非常接近上午9点。Daily并不能真正告诉你它在一天中运行的时间,而你指定为上午9点。两者都作为
man 5 crontab工作
说明了这一点
第0-7周的某一天(0或7是太阳,或使用名称)
您的权利,我已经检查了man crontab(没有太多说明)但不是man 5 crontab,它解释了0和7都被算作星期天。对不起,这一个实际上会在每个星期天和月的前7天工作。请看这里:这与上面的一个类似,但我更喜欢它的可读性。这应该是正确的答案,我要说的是,maniac!的答案的第二部分指出:但是will FAIL“他的意思是它将在BASH上的CMD中失败,但如果它是crontab,则不会失败。如果您处于非英语区域设置,则会失败(因为
%a
输出特定于区域设置的字符串)。它也不能移植到其他unix,因为
/bin/sh
是具有
的shell[
不支持
==
操作符的实现(例如,Ubuntu,其中
/bin/sh
是破折号)。这太棒了,这
-le
东西记录在哪里?我需要在第一个星期日、第二个星期日、第三个星期日、第四个星期日和(可能)第五个星期日做同样的事情……与
测试一样
# This does NOT work.
0 9 1-7 * 0 /path/to/your/script
# This DOES work.
0 9 1-7 * * [ $(date +\%u) = 7 ] && /path/to/your/script