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

时间:2019-01-24 12:02:30

标签: docker tcp slurm

我有一个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。

1 个答案:

答案 0 :(得分:0)

由于我不使用udocker,因此这是黑暗中的镜头。

在要通过sbatch提交的slurm提交脚本中,您可以为两个作业分配足够的资源以在同一节点上运行(因此,您只需为客户端/服务器引用localhost)即可。像这样在后台开始您的第一个过程:

udocker container_name container_args &

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

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

udocker 2nd_container_name more_args

这将在不带&的情况下运行,以使该过程保持在前台。理想情况下,当第二个容器完成时,脚本将完成,并且清理代码将杀死第一个容器。如果两个容器都会干净利落地结束,则可以在脚本结尾处等待。

注意事项:

  • 取决于Slurm的配置方式,最后可能无法正确清理进程。您可能需要将第一个udocker的PID捕获为变量,并在退出之前将其杀死。
  • 当第二个容器完成时,第一个容器可能仍在处理中。您可能需要在提交脚本的末尾添加一个sleep命令,以使其有时间完成。
  • 您可能需要找到并希望解决其他任何难题。
相关问题