我的 crontab 文件中有一个条目:
14 17 * * */2 python /home/pi/scripts/irrigate_5mins.py >/dev/null 2>&1
目的是每隔一天运行该命令,这就是联机帮助页 ( man 5 crontab
) 所说的内容*/2
。手册页的实际引用是:
星号后也允许使用步骤,因此如果您想说“每两个小时”,只需使用“*/2”
实际行为是该命令以 2、2、2、1、2、2、2、1 等重复模式运行。例如,在 3 月/4 月,命令于 15 日、17 日运行,18日,20日、22日、24日、25日、27日、29日、31日、第一名4月3日、5日、7日,8号、 10 日、12 日,其中日期大胆的是前一天运行该命令的位置。
所以我的问题是:为什么它会这样,有没有一种(简单的)方法可以让它达到预期的效果?
系统信息:
root@pi:~# uname -a
Linux pi 4.9.28+ #998 Mon May 15 16:50:35 BST 2017 armv6l GNU/Linux
root@pi:~# lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 8.0 (jessie)
Release: 8.0
Codename: jessie
系统连接到计时器可能会或可能不会相关,该计时器会导致每 24 小时进行一次硬重启。
答案1
*/2
通过在星期几字段中指定,您可以在偶数天运行。甚至一周中的几天也是星期一、星期三、星期五和星期日。 (其实,这些都是奇怪的日子,嗯,还是……)
如果您想稍微定期地运行作业,请使用月份字段(第三个字段)。请注意,在天数为奇数的月份中,这将导致作业改为跳过下个月开始的某一天:...、28 日、30 日、(不是 31 日、不是 1 日)、2 日、4 日等。
您可以通过添加偶数天月份的计划和奇数天月份的单独计划来解决此问题(尽管我并没有真正考虑过正确地知道这是否会使其正确匹配)。
另一种可能性是让作业计划本身使用at
而不是使用cron
.这肯定是一个更“黑客”的解决方案,如果作业在开始运行和在两天内成功重新安排自身之间异常终止,或者如果系统在下一次计划运行时碰巧停机,则可能会失败。
答案2
我会安排 cron 作业每天运行。然后脚本可以决定一年中的某一天是否为偶数:如果不是,则退出。
import datetime
today = datetime.date.today()
doy = int(today.strftime("%j"))
if (doy % 2 == 1): exit()
...