pxssh не работает между вычислительными узлами в кластере slurm - PullRequest
0 голосов
/ 18 декабря 2018

Я использую следующий скрипт для соединения двух вычислительных узлов в кластере slurm.

from getpass import getuser
from socket import gethostname
from pexpect import pxssh
import sys 

python = sys.executable
worker_command = "%s -m worker" % python + " %i " + server_socket
pid = 0
children = []
for node, ntasks in node_list.items():
        if node == gethostname():
                continue
        if node != gethostname():
                pid_range = range(pid, pid + ntasks)
                pid += ntasks
                ssh = pxssh.pxssh()
                ssh.login(node, getuser())
                for worker in pid_range:
                        ssh.sendline(worker_command % worker + '&')
                children.append(ssh)

node_list - это словарь {'cn000': 28, 'cn001': 28}.worker - это файл python, помещенный в рабочий словарь.

Я ожидаю, что ssh.sendline будет таким же, как pexpect.spawn.Однако после запуска сценария ничего не произошло.

Несмотря на то, что сессия * ssh была создана ssh.login(node, getuser()), кажется, что строка ssh.sendline(worker_command % worker) не имеет никакого эффекта, потому что сценарий, запускаемый worker_command, не запускается.

Как можноЯ это исправлю?Или я должен попробовать что-то еще?

Как я могу создать один сокет на одном вычислительном узле и соединить его с сокетом на другом вычислительном узле?

1 Ответ

0 голосов
/ 19 декабря 2018

Отсутствует «% s» в содержимом worker_command.Он содержит что-то вроде этого: «/ usr / bin / python3 -m worker» -> worker_command% worker должно привести к ошибке.

Если нет (это возможно, потому что этот источник выглядит как короткая частьоригинальной программы), затем добавьте строку «>> workerprocess.log 2> & 1» перед «&», затем попробуйте запустить вашу программу и взгляните на workerprocess.log на сервере!Если ваш $ HOME доступен для записи на сервере, вы должны найти в нем сообщения об ошибках.

...