Late 属性

有时任务没有按期望运行,我们希望在这种情况发生时得到通知。可以使用 late 属性实现。

每个节点只能有 1 个 late 属性,通常放在 task 节点上。可以在 suite 或 family 节点中定义,子节点可以继承该属性。 底层定义的 late 属性会覆盖掉上层定义的 late 属性。

  • -s submitted:节点可能保持在 submitted 状态的时间(格式:[+]hh:mm)。sumitted 总是相对的,所以 + 被忽略。如果节点在 submitted 状态超过给定时间,late 标志则会被设置。
  • -a Active:节点必须启动(状态为 active)的时间(格式:hh:mm)。如果节点还处于 queuedsubmitted 状态,则会设置 late 标志。
  • -c Complete:节点必须完成(状态为 complete)的时间(格式:{+}hh:mm)。如果是相对时间,时间从节点开始运行后计算,否则节点必须在给定时间点时完成。

示例

  1. task t1
  2. late -s +00:15 -a 20:00 -c +02:00

上面的设置含义是:节点保持在 submitted 状态不能超过 15 分钟,必须在 20:00 前启动,运行时间不能超过 2 小时。

本教程中,我们只为运行时间添加 late 属性。

Ecf 脚本

  1. %include <head.h>
  2. echo "I will now sleep for %SLEEP% seconds"
  3. sleep %SLEEP%
  4. %include <tail.h>

Suite 定义

文本方式

  1. # Definition of the suite test.
  2. suite test
  3. edit ECF_INCLUDE "$ECF_HOME" # replace $ECF_HOME with the path to your ECF_HOME directory
  4. edit ECF_HOME "$ECF_HOME"
  5. family f6
  6. edit SLEEP 120
  7. task t1
  8. late -c +00:01 # set late flag if task take longer than a minute
  9. endfamily
  10. endsuite

Python

  1. import os
  2. from pathlib import Path
  3. from ecflow import Defs, Suite, Task, Family, Edit, Trigger, \
  4. Event, Complete, Meter, Time, Day, Date, Cron, Label, \
  5. RepeatString, RepeatInteger, RepeatDate, Limit, InLimit, \
  6. Late
  7. # ...skip...
  8. def create_family_f6():
  9. return Family("f6",
  10. Edit(SLEEP=120),
  11. Task('t1',
  12. Late(complete="+00:01")))
  13. print("Creating suite definition")
  14. home = os.path.abspath(Path(Path(__file__).parent, "../../../build/course"))
  15. defs = Defs(
  16. Suite('test',
  17. Edit(ECF_INCLUDE=home, ECF_HOME=home),
  18. Limit("l1", 2),
  19. create_family_f1(),
  20. create_family_house_keeping(),
  21. create_family_f3(),
  22. create_family_f4(),
  23. create_family_f5(),
  24. create_family_f6()))
  25. print(defs)
  26. print("Checking job creation: .ecf -> .job0")
  27. print(defs.check_job_creation())
  28. print("Saving definition to file 'test.def'")
  29. defs.save_as_defs(str(Path(home, "test.def")))
  30. # To restore the definition from file 'test.def' we can use:
  31. # restored_defs = ecflow.Defs("test.def")

运行结果:

  1. $python test.py
  2. Creating suite definition
  3. # 4.8.0
  4. suite test
  5. edit ECF_INCLUDE '/g3/wangdp/project/study/ecflow/ecflow-tutorial-code/build/course'
  6. edit ECF_HOME '/g3/wangdp/project/study/ecflow/ecflow-tutorial-code/build/course'
  7. # ... skip ...
  8. family f6
  9. edit SLEEP '120'
  10. task t1
  11. late -c +00:01
  12. endfamily
  13. endsuite
  14. Checking job creation: .ecf -> .job0
  15. Saving definition to file 'test.def'

任务

  1. 修改
  2. 替换 suite 定义
  3. 运行 suite,在 ecflow_ui 中应该可以看到 task 的 late 标签。

    Late 属性 - 图1