2010-06-01 53 views
1

我試圖通過命令行使用pexpect啓動服務器應用程序(在erlang中打開端口並監聽http請求)(甚至直接使用subprocess.Popen( ))。python,運行命令行服務器 - 它們沒有正確監聽

該應用程序啓動正常,日誌(通過pexpect)的屏幕罰款,我可以通過命令行與它進行交互...
問題是,服務器將不會偵聽傳入的請求。應用程序會在我手動啓動時偵聽,方法是在命令行中輸入命令。使用子進程/ pexpect停止應用程序聽從某處...
當我手動啓動它時,「netstat -tlp」顯示應用程序爲偵聽,當我通過python啓動它時(subprocess/pexpect)netstat不註冊應用程序。 。

我有一種感覺,它與環境,Python的方式叉東西等方式有關。 任何想法?

謝謝

基本的例子: 注:
「-pz」 - 只是廣告./ebin爲ERL VM模塊路徑,庫搜索路徑
「-run」 - 運行MODULENAME,沒有任何參數。

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

所有這些東西工作正常,這很奇怪。我有我的代碼和所有的日誌消息輸出,因爲他們應該。即使我通過bash腳本啓動了它的進程,服務器也不會聽,所以我不認爲它的python代碼導致它(這就是爲什麼我有一種感覺,它關於新的OS進程開始的方式)。

+0

您的服務器是否打開一個普通的UNIX套接字並將其設置爲偵聽?或者是別的什麼。像費邊建議的那樣,一些代碼會很有用。 – 2010-06-01 11:46:17

+0

erlang服務器使用misultin庫,它本身會打開unix套接字。當我手動啓動erl虛擬機時,一切正常,然後在其命令行中啓動主應用程序模塊(erl VM進程然後由netstat正確報告爲在指定端口上偵聽) – deepblue 2010-06-01 15:14:11

回答

0

這可能與命令行參數傳遞給子進程的方式有關。

沒有更具體的代碼,我不能肯定地說,但我有這個問題上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) 

這不僅會讓你看到你正在啓動的命令,而應該正確地將值傳遞給可執行文件。雖然我不能確定沒有看到一些代碼,但這似乎是最可能的失敗原因(也可能是程序需要特定的工作目錄或配置文件?)。