【问题标题】:Using SLURM to run TCP client, server使用 SLURM 运行 TCP 客户端、服务器
【发布时间】:2019-02-02 23:01:25
【问题描述】:

我有一个 Docker 映像,需要在我没有管理员权限的环境中运行,在 RHEL 中使用 Slurm 17.11.8。我正在使用 udocker 来运行容器。

在这个容器中,有两个应用需要运行:

[1] ROS 模拟(有一个 rosnode 是一个与 [2] 对话的 TCP 客户端)

[2] 一个可执行文件(TCP 服务器)

所以 [1] 和 [2] 需要一起运行,并且它们还共享一些公共文件。通常,我在单独的终端中运行它们。但我不知道如何用 SLURM 做到这一点。

可能的解决方案:

(A) 使用相同图像的两个容器,但它们的文件将存储在本地。可以改用卷。但这需要我显着更改我的代码,并且当我不将其作为容器运行时(例如在 Eclipse 中)可能会破坏兼容性。

(B) 使用 bash 脚本启动两个终端并运行 [1] 和 [2]。然后运行这个脚本。

我正在查看 (B),但不知道如何处理它。我研究了其他方法,但它们解决了多个进程的顺序执行问题。我需要这些是并发的。

如果有帮助,我正在使用 xfce-terminal,尽管我可以切换到其他终端,例如 Gnome、Konsole。

【问题讨论】:

    标签: docker tcp slurm


    【解决方案1】:

    这是在黑暗中拍摄的,因为我不使用 udocker。

    在您的 slurm 提交脚本中,要与 sbatch 一起提交,您可以为两个作业分配足够的资源以在同一节点上运行(因此您只需为您的客户端/服务器引用 localhost)。在后台启动您的第一个进程,例如:

    udocker container_name container_args &
    

    & 应该在后台启动第一个容器。

    然后您将启动第二个容器:

    udocker 2nd_container_name more_args
    

    这将在没有 & 的情况下运行以将进程保持在前台。理想情况下,当第二个容器完成时,脚本会完成并且 slurm cleanup 会杀死第一个容器。如果两个容器都干净利落地结束,您可以在脚本结束时等待。

    注意事项:

    • 根据 Slurm 的配置方式,最终可能无法正确清理进程。您可能需要将第一个 udocker 的 PID 作为变量捕获并在退出之前将其终止。
    • 当第二个容器完成时,第一个容器可能仍在处理中。您可能需要在提交脚本的末尾添加一个 sleep 命令,以便有时间完成。
    • 可能存在许多其他问题,您需要找到这些问题并希望能够解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-20
      • 2012-01-04
      • 2013-02-17
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多