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



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

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

udocker container_name container_args &

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

然后启动第二个容器:

udocker 2nd_container_name more_args

这将在没有&以保持进程处于前台。理想情况下,当第二个容器完成时,脚本将完成,而slum清理将杀死第一个容器。如果两个容器都将干净地结束,您可以在脚本的末尾放置一个等待。

注意事项:

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

最新更新