ecFlow学习笔记02.4.9 —— Zombie
该教程的最新版已发布在GitHub上,请访问ecflow-tutorial-cn
这是 ecFlow 教程的一部分,完整教程请参看《ecFlow学习笔记02 —— 教程》
- *Zombie 是与 ecflow_server 通信验证权限失败的正在运行的作业。
如何产生
多种原因,常见的集中:
- 作业运行时,节点树被删除、替换、重新加载。
- 作业正在运行时(处于 submitted 或 active 状态),被重新运行
- 作业被强制设为新状态,如 complete
更罕见的原因有:
- ecf 脚本错误,多次运行初始化或完成命令
- ecf script 中的 child command 被放到后台,这种情况下,子节点命令执行顺序不正确。
- 负载控制器多次提交作业
- 服务器宕机,恢复 check point 文件过期
- 机器故障
如何处理
init complete wait 命令的默认行为是 block 作业,event label meter的默认行为是 fob。
子节点命令持续尝试连接 ecflow_server,直到24小时(由 ecflow_client 端的 ECF_TIMEOUT 指定)。
可以设置子节点命令在服务器拒绝连接时立刻出错(查看 ecflow_client 的 ECF_DENIED)。
ecflowview 提供一个对话框,列出所有的 zombies 和可以采用的处理方法。包括:
Terminate
令命令失败,根据脚本可能会调用 abort 命令,会导致生成新的 zombie。
Fob
允许作业继续运行。child command 命令运行结束,因此不再阻止作业。
但要特别注意可能会出现的问题。如果有两个运行中的作业,会导致数据冲突。即便有大哥作业,可以能产生问题。例如,相关命令是 event 命令,该 event 将不会被设置,如果后续的 trigger 表达式中有该 event,该 trigger 就不会生效。
Delete
从服务器移除 zombie,作业仍被阻塞,子节点命令再次尝试连接 ecflow_server 时,会再次出现zombie。
手动杀掉作业时,可以使用该选项
Rescure
接受 zombie,更新节点树。zobmie 的 ECF_PASS 将会拷贝到 task 上,因此下一次的 child command 将会正常运行。用户要确保没有其他作业运行。
Kill
使用 ECF_KILL_CMD 杀掉 zombie。如果脚本中正确的信号捕获,该操作会以调用 abort 结束。
path zombies 需要手动杀掉。
注意:上面四中方法中,只有 Rescue 允许 child command 修改节点树的状态。
任务
- 创建一个 zombie:启动某个 task,通过 ecflowview 立即将它设为 complete。
- 查看 log 文件,可以看到 zombie 如何形成。
- 在 ecflowview 中查看 zombie 对话框(鼠标右键点击 host 节点)。
- 试验不同的 zombie 处理方法
Terminate
Terminate 日志
Terminate 后找不到该进程
Rescue
- 选择 host 节点,打开 option… 菜单。选择 Zombies 按钮,将在发现 zombie 时弹出通知窗口。
词汇表
zombie
ecflow_server
node
task
submitted
active
complete
ecf script
child command
check point
ecflow_client
ecflowview
event
trigger