添加另一个任务

我们来添加一个新任务 t2,需要修改 suite definition 文件并添加一个新的脚本。

$ECF_HOEM/course/test 中创建文件 t2.ecf,直接复制 t1.ecf 即可。

首先修改 suite definition。

文本方式

在重新加载 suite 的任何部分前推荐先将 suite 挂起(suspend)。在 ecflow_ui 中右键点击 suite,选择 Suspend。当修改完成后,右键点击 suite,选择 Resume。

添加另一个任务 - 图1

挂起后,suite 颜色会改变

添加另一个任务 - 图2

恢复 suite

添加另一个任务 - 图3

添加新任务 t2 的 def 文件

  1. # Definition of the suite test
  2. suite test
  3. edit ECF_HOME "$ECF_HOME/course"
  4. task t1
  5. task t2
  6. endsuite

译者注:与之前一样,需要设置环境变量 $ECF_HOME

test 目录下,复制 t1.ecf,创建 task t2 的脚本 t2.ecf

重新加载 def 文件

  1. ecflow_client --load=test.def

如果已经加载过 def 文件,上述命令不会成功。

  1. $ecflow_client --host=login05 --port=33083 --load=../../../build/course/test.def
  2. Error: request( --load=../../../build/course/test.def :wangdp ) failed! Server replied with: 'Add Suite failed: A Suite of name 'test' already exist'
  3. make: *** [load] Error 1

需要删除原有的suite,并重新加载:

  1. ecflow_client --host=login05 --port=33083 --delete=_all_
  2. ecflow_client --host=login05 --port=33083 --load=test.def

接着启动 suite

  1. ecflow_client --host=login05 --port=33083 --begin=test

可以不用删除原来的 suite,替换整个 suite 定义:

  1. ecflow_client --host=login05 --port=33083 --replace=/test test.def

可以只替换 suite 的一部分:

  1. ecflow_client --host=login05 --port=33083 --replace=/test/t2 test.def

替换一部分后的状态

添加另一个任务 - 图4

这时可以恢复 suite。

Python方式

使用 Client Server API 删除 suite definition,重载和启动 suite。

首先更新 test.py,重新生成 def 文件:

  1. import os
  2. from pathlib import Path
  3. from ecflow import Defs, Suite, Task, Edit
  4. print("Creating suite definition")
  5. home = os.path.abspath(Path(Path(__file__).parent, "../../../build/course"))
  6. defs = Defs(
  7. Suite(
  8. 'test',
  9. Edit(ECF_HOME=home),
  10. Task('t1'),
  11. Task('t2')
  12. )
  13. )
  14. print(defs)
  15. print("Checking job creation: .ecf -> .job0")
  16. print(defs.check_job_creation())
  17. print("Saving definition to file 'test.def'")
  18. defs.save_as_defs(str(Path(home, "test.def")))

删除所有的 suite,重新加载修改后的 def文件,需要修改 client.py

  1. import os
  2. from pathlib import Path
  3. import ecflow
  4. home = os.path.abspath(Path(Path(__file__).parent, "../../../build/course"))
  5. try:
  6. print("Loading definition in 'test.def' into the server")
  7. ci = ecflow.Client('login05', '33083')
  8. ci.delete("/test")
  9. ci.load(str(Path(home, "test.def")))
  10. ci.begin_suite("test")
  11. except RuntimeError as e:
  12. print("Failed:", e)

我们还可以替换全部或部分 suite。

另外,我们不希望 suite 立即运行,可以通过 ecflowview 挂起整个 suite,不过我们每次都需要记得这样做。 为了方便,可以使用 Python Client API 挂起 suite。修改上面的 client.py

  1. import os
  2. from pathlib import Path
  3. import ecflow
  4. home = os.path.abspath(Path(Path(__file__).parent, "../../../build/course"))
  5. try:
  6. print("Loading definition in 'test.def' into the server")
  7. ci = ecflow.Client('login05', '33083')
  8. ci.suspend("/test")
  9. ci.replace("/test", str(Path(home, "test.def")))
  10. except RuntimeError as e:
  11. print("Failed:", e)

说明:为了简便,后面的例子我们都不会列出加载 suite 的过程。

任务

  1. 使用 ecflow_ui 或 pyhton 的 ecflow.Client.suspend 挂起 suite
  2. 创建新的 task
  3. 通过拷贝 t1.ecf 创建 t2.ecf
  4. 更新 python 脚本 test.pyclient.pytest.def
  5. 替换 suite

    python:

    1. python test.py
    2. python client.py

    文本:

    1. ecflow_clinet --replace=/test test.def
  6. 使用 ecflow_ui 恢复 suite

  7. 在 ecflow_ui 中观察两个任务运行情况,它们应该在同一时刻运行。