Docker 使用SLURM运行TCP客户端、服务器

Docker 使用SLURM运行TCP客户端、服务器,docker,tcp,slurm,Docker,Tcp,Slurm,我有一个Docker映像,需要在没有管理员权限的环境中运行,使用RHEL中的Slurm 17.11.8。我正在使用udocker运行容器 在此容器中,需要运行两个应用程序: [1] ROS模拟(有一个rosnode,它是与[2]对话的TCP客户端) [2] 可执行文件(TCP服务器) 所以[1]和[2]需要一起运行,并且它们还共享一些公共文件。通常,我在不同的终端上运行它们。但我不知道如何处理SLURM 可能的解决办法: (A) 使用相同图像的两个容器,但它们的文件将存储在本地。可以改为使用卷。

我有一个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终端,尽管我可以切换到其他终端,如Gnome、Konsole。

这是一个冒险,因为我不使用udocker

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

udocker container_name container_args &
&应该在后台启动第一个容器

然后启动第二个容器:

udocker 2nd_container_name more_args
这将在没有&的情况下运行,以使进程保持在前台。理想情况下,当第二个容器完成时,脚本将完成,slurm cleanup将终止第一个容器。如果两个容器都将干净地结束,则可以在脚本的末尾放置等待

注意事项:

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