跳转至

计划如何被触发?

简单重复模式

  nexttime: 0      # 下一次输出这个任务的时间,0 代表明天,1 就是后天,依次类推
  period: 7        # 循环周期,每 7 天输出一次。如果想每天都输出,改为 1 即可

日历模式

不依赖其他信息,根据当日日期就能直接判断是否符合的

第一种,重复型的

  every: 6-12

第二种,单次型的,在执行之后会删除任务

  on: 2025-8-26

还有一个每天都输出任务的快捷方式,使用 every: day

  every: day

支持用列表指定多个日期

  every: [Sat, Sun] # 匹配每周六和周日

需要注意,用 on 时,匹配任意一个日期,就会把整个 on 删除掉。

  on: [Sat, Sun]

如果想只删除对应的,可以将 on 作为多个独立的触发模式

  trigger:
  - on: Sat
  - on: Sun

参考配置

重复型: - 每年的 6 月 12 日: every: 6-12 - 每周三: every: Wednesdayevery: Wedevery: 周三every: 星期三 - 每月的 15 日: every: 15 - 八月的每一天: every: Augustevery: Augevery: 八月

单次型: - 在 7 月 15 日: on: 7-15 - 在下次的 5 号: on: 5 - 在 2025 年 8 月 26 日: on: 2025-8-26 ,其实 every: 2025-8-26 也只会输出一次,不同之处在于它不会自动删除

需要注意的是,如果指定 31 号,但是当月没有这一天,则在月底不会触发,该模式是严格遵守指定的日期的。


农历日期

相比公历,需要在日期前加“农历”二字,如果指定的是闰月,则还需要在最后增加“闰”字

  every: 农历6-12闰

也可以加上空格

  every: 农历 6-12 闰

另外,every 后面还可以跟二十四节气

  every: 立秋

公历高级重复

根据相对描述决定任务日期

简单重复只是以天为最小单位,也是唯一单位。高级重复,则可以以月和年为周期,以周和天为单位指定日期。

  • 指定起始日期: from: 2025-11-19 ,必须从年份开始,如果省略几号,就视作 1 号,如果再省略几月,就视作 1 月。有些情况下,这个参数可以省略,比如每月,每年这种。
  • 指定一个周期:可以是每几天、每几周、每几月、特定月份、每几年, every: 3weekevery: 2monthevery: Juneevery: year
  • 指定想要的那一天,可以用第几天或周几描述,如:第三天 on: 3d、倒数第一天 on: -daylast: day、第一个星期一 on: Monday、倒数第一个星期五 on: -Frilast: Fri

每个月、每年的某一天

每月第一个星期一

  every: month
  on: Monday

每月倒数第二天运行一次

  every: month
  on: -2d

每月最后一个星期六

  every: month
  last: Sat   # 也可以是,last: 1Sat

每月倒数第二个星期六

  every: month
  last: 2Sat

每个六月的最后一个星期六

  every: June
  last: Sat

每年最后一个星期六

  every: year
  last: Sat

今天是第一天,每若干天、若干周、若干月、若干年就触发一次

如果只有 every 和 from ,没有 on 或 last,那么含义就是把 from 作为第一天,每经过一次 every 就被触发一次。下面举例说明。

每 16 天一次,会在 2025-8-11、2025-8-27、2025-9-12 ... 触发

  from: 2025-8-11
  every: 16d

每 3 周一次,会在 2025-11-21、2025-12-12 ... 触发

  from: 2025-11-21
  every: 3week

每 2 月一次,会在 2025-11-21、2026-1-21 ... 触发

  from: 2025-11-21
  every: 2month

每 2 年一次,会在 2025-11-21、2027-11-21 ... 触发

  from: 2025-11-21
  every: 2year

需要注意的是,假如第一天是某月的 31 号,下一次的月份可能没有 31 号,此时,会在下一次的月份的最后一天触发,如 30 号就被触发。

如果是一年一次,可以直接用 every: 11-21 实现,更简单直观

每若干天、若干周、若干月、若干年的某一天

从 2025 年 11 月 21 日起,每三周中的第一周的周三。也就是会在 11 月 19 号(但已经过去)、 12 月 10 号被触发

  from: 2025-11-21
  every: 3week
  on: Wed  # 用 on: 3d 也可以

从 2025 年 8 月起,每两个月中的第一个月的倒数第七天。也就是会在 8 月 25 号、 10 月 25 号被触发

  from: 2025-8
  every: 2month
  last: 7d

从 2025 年开始,每两年中的第一年的第三天运行

  from: 2025
  every: 2year
  on: 3d

可以发现,from 指定的日期可以不必精准到天,如果周期是年,到年就行,周期是某几天,就精确到天。特殊的是,周期是周的话,可以指定开始周中的任意一天,都将表示那一周。

另外,这里还有一个限制,只会从每若干周中的第一周、每若干月中的第一个月这样第一个里面去找,如果想要在第二个里面去找,可以更改 from 的日期,调整为从第一个里面去找。

进一步定制周期

通过将周期的左右边界往中间收,对周期进行定制,姑且称为向右偏移和向左偏移。

偏移单位可以是天和周,两周后 after: 2week、倒数第一周前 ahead: 1week、四天后 after: 4d、倒数第四天前 ahead: 4d

有用的设置是,先偏移几周,然后再偏移几天,或者先偏移几天,再找第几个周几。

需要说明一下先偏移一周的含义,比如要实现:每月不算第一周,之后的第三天。假如这个月第一天是周四,不算第一周,就是把 1 号(周四)到 4 号(周日)都不算在内,所以会在 7 号被触发。

  every: month
  after: 1week  # 建议保留数字,这样含义更明确
  on: 3day

这样的功能是应对这样的场景:每月两周后的第三天,不一定是这个月的第三个周三,也可能是第二个周三。

每月最后一周之前的倒数第二天

  every: month
  ahead: 1week
  on: -2day

先偏移几天,再找星期几。

每月 4 天后的第一个周五

  every: month
  after: 4d
  on: Fri

每月倒数第 4 天后的倒数第一个周五

  every: month
  ahead: 4d
  on: -Fri

从含义上讲,如果一个任务是从某天开始每若干周一次 from 2025-7-8 every 3week,已经完全决定了每次触发的时间,此时添加预偏移是无意义的,也不会生效。

动态检查模式

根据 GitHub release 是否更新进行判断

  ask:
    about: github_release
    that: {project_name: XTLS/Xray-core}
    last_value: ""
  tag: xray_is_updated

当有更新时,该任务会添加 tag,其他任务可以继续通过该 tag 触发。

依赖模式

if 后面需要使用 tag ,可以用 and 和 or 指定多个条件

可以同时使用 after 和 before

希望计划 B 与计划 A 同时被触发,或者在计划 A 之前或之后的某一天执行,它们的关系是计划 B 的触发依赖计划 A 的触发。

首先,在计划 A 添加一个 tag

- desc: 计划 A
  every: 2025-1-11
  tag: common_day

同时触发,只需要使用 if,后面可以跟 tag 或日期

- desc: 计划 B
  if: common_day

计划 A 后的第 2 天 2025-1-13

  if: common_day
  after: 2d

计划 A 前的第 6 天 2025-1-5

  if: common_day
  before: 6d

计划 A 前的第 1 个星期六(含当天) 2025-1-11

TODO 不含当天呢?

  if: common_day
  before: Sat

计划 A 前的第 2 个星期六 2025-1-4

  if: common_day
  before: 2Sat

TODO 如果计划的时间不确定呢?比如 github release,那么从语义上说,就是不可能完成的事情,所以退化为当天触发,并提示

TODO 依赖成链也要能支持,检测环链

复合模式

如果一个计划有多种触发模式,可以通过写多个相同的计划,每一个用一种触发模式实现,但这样比较繁琐,还可以把所有触发模式放在一个列表里,然后放在 trigger 下面

下面是每周六和月末周日触发该计划

  trigger:
  - every: Sat
  - every: month
    last: Sun

要注意的是,如果计划里使用了 trigger,就不能再把触发模式放在顶层,下面这样是非法的

  every: month
  last: Sun
  trigger:
  - every: Sat

触发模式之间的关系

前面所述是满足触发模式中任意一个即可,这是或关系。

如果需要所有触发模式都满足才行,也就是与关系,可以这样指定,以“每月最后一日,且该日是周六的情况下”为例:

  trigger:
  - every: month
    last: day
  - every: Sat
  match: all  # 默认值是 any