Использование SLURM для запуска TCP-клиента, сервера - PullRequest
0 голосов
/ 24 января 2019

У меня есть образ Docker, который необходимо запустить в среде, где у меня нет прав администратора, используя Slurm 17.11.8 в RHEL. Я использую Udocker для запуска контейнера.

В этом контейнере нужно запустить два приложения:

[1] Симуляция ROS (существует узел, с которым TCP-клиент разговаривает [2])

[2] Исполняемый файл (TCP-сервер)

Так что [1] и [2] должны работать вместе, и они также делятся некоторыми общими файлами. Обычно я запускаю их в отдельных терминалах. Но я понятия не имею, как это сделать с SLURM.

Возможное решение:

(A) Используйте два контейнера одного изображения, но их файлы будут храниться локально. Можно использовать тома вместо. Но это требует от меня значительного изменения кода и, возможно, нарушения совместимости, когда я не запускаю его как контейнеры (например, в Eclipse).

(B) Используйте bash-скрипт для запуска двух терминалов и запуска [1] и [2]. Затем запустите этот скрипт.

Я смотрю на (B), но не знаю, как к нему приблизиться. Я рассмотрел другие подходы, но они касаются последовательного выполнения нескольких процессов. Мне нужно, чтобы они были параллельными.

Если это поможет, я использую xfce-терминал, хотя я могу переключаться на другие терминалы, такие как Gnome, Konsole.

1 Ответ

0 голосов
/ 02 февраля 2019

Это выстрел в темноте, так как я не работаю с Udocker.

В вашем скрипте отправки slurm, который будет отправлен с помощью sbatch, вы можете выделить достаточно ресурсов для выполнения обоих заданий на одном и том же узле (поэтому вам просто нужно указать localhost для вашего клиента / сервера).Начните свой первый процесс в фоновом режиме с чего-то вроде:

udocker container_name container_args &

& должен запустить первый контейнер в фоновом режиме.

Затем вы запустите второй контейнер:

udocker 2nd_container_name more_args

Это будет работать без &, чтобы сохранить процесс на переднем плане.В идеале, когда второй контейнер завершает работу, скрипт завершается, а очистка от грязи убивает первый контейнер.Если оба контейнера будут окончательно завершены, вы можете поставить ожидание в конец сценария.

Предостережения:

  • В зависимости от конфигурации Slurm процессы могут работать некорректноубран в конце.Вам может потребоваться захватить PID первого udocker как переменную и уничтожить его перед выходом.
  • Первый контейнер может все еще обрабатываться, когда второй завершается.Возможно, вам придется добавить команду сна в конце сценария отправки, чтобы дать ему время закончить.
  • Может существовать любое количество других ошибок, которые вам нужно будет найти и, возможно, обойти.
...