python, работающие серверы командной строки - они не слушают должным образом

Я пытаюсь запустить серверное приложение (в erlang открывает порты и прослушивает http-запросы) через командную строку, используя pexpect (или даже напрямую, используя subprocess.Popen()).

приложение запускается нормально, регистрируется (через pexpect) на экране нормально, я также могу взаимодействовать с ним через командную строку...
проблема в том, что серверы не прослушивают входящие запросы. Приложение слушает, когда я запускаю его вручную, вводя команды в командной строке. использование subprocess/pexpect каким-то образом останавливает прослушивание приложения...
когда я запускаю его вручную, «netstat -tlp» отображает приложение как прослушивающее, когда я запускаю его через python (subprocess/pexpect), netstat не регистрирует приложение. ..

У меня есть ощущение, что это как-то связано с окружающей средой, с тем, как питон разветвляется и т. Д. Есть идеи?

благодарю вас

базовый пример: примечание:
"-pz" - просто объявляет ./ebin путь к модулям для виртуальной машины erl, путь поиска библиотеки
"-run" - запускает имя_модуля без каких-либо параметров.

command_str = "erl -pz ./ebin -run moduleName"  
child = pexpect.spawn(command_str)  
child.interact() # Give control of the child to the user

все это работает корректно, что странно. У меня есть журнал внутри моего кода, и все сообщения журнала выводятся так, как должны. сервер не будет слушать, даже если я запустил его процесс с помощью сценария bash, поэтому я не думаю, что это вызвано кодом Python (поэтому у меня такое ощущение, что это что-то касается того, как запускается новый процесс ОС).


person deepblue    schedule 01.06.2010    source источник
comment
Ваш сервер открывает обычный сокет UNIX и настраивает его на прослушивание? Или что-то еще. Как предложил Фабиан, некоторый код был бы полезен.   -  person Noufal Ibrahim    schedule 01.06.2010
comment
сервер erlang использует библиотеку misultin, которая сама открывает сокеты unix. все работает нормально, когда я запускаю виртуальную машину erl вручную, а затем в ее командной строке запускаю основной модуль приложения (затем netstat правильно сообщает о процессе виртуальной машины erl как о прослушивании указанного порта)   -  person deepblue    schedule 01.06.2010


Ответы (1)


Это может быть связано с тем, как аргументы командной строки передаются подпроцессу.

Без более конкретного кода я не могу сказать наверняка, но у меня была эта проблема при работе с sshsplit ( https://launchpad.net/sshsplit )

Чтобы правильно передать аргументы (в этом примере «ssh -ND 3000»), вы должны использовать что-то вроде этого:

openargs = ["ssh", "-ND", "3000"]
print "Launching %s" %(" ".join(openargs))
p = subprocess.Popen(openargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Это не только позволит вам точно увидеть, какую именно команду вы запускаете, но и правильно передать значения в исполняемый файл. Хотя я не могу сказать наверняка, не видя некоторого кода, это кажется наиболее вероятной причиной сбоя (может также быть, что программе требуется определенный рабочий каталог или файл конфигурации?).

person Martin Eve    schedule 01.06.2010