运行远程作业

ecFlow 使用 ECF_JOB_CMD 变量值提交作业。修改该变量可以控制在哪里如何运行作业。 该变量应该与 ECF_JOBECF_JOBOUT 变量同时使用。

  • ECF_JOB 是作业文件(job file)的路径
  • ECF_JOBOUT 是标准输出流的文件位置

默认的命令如下:

  1. ECF_JOB_CMD = %ECF_JOB% 1> %ECF_JOBOUT% 2>&1 &

接下来,我们将在远程主机上运行程序。需要使用 UNIX 命令 ssh

我们使用 HOST 变量定义远程主机的名字,我们假设所有远程主机上的文件都可见(例如使用 NFS)。

下面的例子中将字符串 ?????? 替换为你的实际的主机名。

注意:远程运行任务的主机环境可能与本地运行的环境不同。这取决于你的系统如何设置。 head.h 中应该使用设置正确的 PATH,可以直接调用 child command。
如果没有设置,在 head.h 中调用 ecflow_client --init 前添加下面的语句:

  1. export PATH=$PATH:/usr/local/apps/ecflow/%ECF_VERSION%/bin

使用 ssh 需要远程主机上配置好 public key。 检查不用密码是否能登陆到远程主机。如果需要输入密码,则需要将你的 pulic key 添加到远程机器上。 执行下面的命令:

  1. REMOTE_HOST=??????
  2. ssh $USER@$REMOTE_HOST mkdir -p \$HOME/.ssh
  3. cat $HOME/.ssh/id_rsa.pub || ssh-keygen -t rsa -b 2048
  4. cat $HOME/.ssh/id_rsa.pub | ssh $USER@$REMOTE_HOST 'cat >> $HOME/.ssh/authorized_keys'

修改 family f5,是所有任务都在远程服务器上运行。本教程中的 ecflow 服务运行在 login05 节点中,下面使用 login08 节点运行 f5 下的所有作业。

Suite Definition

Text

  1. # Definition of the suite test
  2. suite test
  3. edit ECF_INCLUDE "$ECF_HOME"
  4. edit ECF_HOME "$ECF_HOME"
  5. limit l1 2
  6. family f5
  7. edit HOST ??????
  8. edit ECF_OUT /tmp/$USER
  9. edit ECF_JOB_CMD "ssh %HOST% 'mkdir -p %ECF_OUT%/%SUITE%/%FAMILY% && %ECF_JOB% > %ECF_JOBOUT% 2>&1 &'"
  10. inlimit l1
  11. edit SLEEP 20
  12. task t1
  13. task t2
  14. task t3
  15. task t4
  16. task t5
  17. task t6
  18. task t7
  19. task t8
  20. task t9
  21. endfamily
  22. endsuite

如果 login shell 是 csh,应该这样定义 ECF_JOB_CMD

  1. edit ECF_JOB_CMD "ssh %HOST% 'mkdir -p %ECF_OUT%/%SUITE%/%FAMILY%; %ECF_JOB% >& %ECF_JOBOUT%'"

Python

修改前面创建的 create_family_f5() 函数。

  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_f5():
  9. return Family("f5",
  10. InLimit("l1"),
  11. Edit(SLEEP=20,
  12. HOST='login08',
  13. ECF_LOGHOST="%HOST%",
  14. ECF_LOGPORT="33084",
  15. ECF_JOB_CMD="ssh %HOST% '%ECF_JOB% >& %ECF_JOBOUT%'"),
  16. [Task('t{}'.format(i)) for i in range(1, 10)])
  17. # ...skip...
  18. print("Creating suite definition")
  19. home = os.path.abspath(Path(Path(__file__).parent, "../../../build/course"))
  20. defs = Defs(
  21. Suite('test',
  22. Edit(ECF_INCLUDE=home, ECF_HOME=home),
  23. Limit("l1", 2),
  24. create_family_f1(),
  25. create_family_house_keeping(),
  26. create_family_f3(),
  27. create_family_f4(),
  28. create_family_f5(),
  29. create_family_f6()))
  30. print(defs)
  31. print("Checking job creation: .ecf -> .job0")
  32. print(defs.check_job_creation())
  33. print("Saving definition to file 'test.def'")
  34. defs.save_as_defs(str(Path(home, "test.def")))
  35. # To restore the definition from file 'test.def' we can use:
  36. # 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. limit l1 2
  8. # ... skip ...
  9. family f5
  10. edit SLEEP '20'
  11. edit HOST 'login08'
  12. edit ECF_LOGHOST '%HOST%'
  13. edit ECF_LOGPORT '33084'
  14. edit ECF_JOB_CMD 'ssh %HOST% '%ECF_JOB% >& %ECF_JOBOUT%''
  15. inlimit l1
  16. task t1
  17. task t2
  18. task t3
  19. task t4
  20. task t5
  21. task t6
  22. task t7
  23. task t8
  24. task t9
  25. endfamily
  26. # ... skip ...
  27. endsuite
  28. Checking job creation: .ecf -> .job0
  29. Saving definition to file 'test.def'

Logserver

我们可以通过使用一个日志服务器查看远程服务器上的输出文件。

假设已定义变量 ECF_LOGHOSTECF_LOGPORT

在远程服务器上运行 logserver:

  1. ssh $USER@class01 /usr/local/apps/ecflow/4.8.0/bin/start_logserver -d /tmp/$USER -m /tmp/$USER:/tmp/$USER

译者注:尚未实验该功能,后续添加。

任务

  1. 修改 head.h 中的环境变量

  2. 修改 suite definitino

  3. 替换 suite definition

  4. 可能不会立即生效,查看日志文件 $ECF_HOME/host.port.ecf.log 寻找原因。

  5. 在 ecf script 脚本中添加 hostname 检查任务运行在哪台主机

    运行远程作业 - 图1

  6. 如何才能让 /test/f5/t9 运行在另外一台主机上?实验你的方法。

  7. 创建一个 log 服务器,访问远程输出。