2010-07-28 49 views
0

此代碼應該嘗試並啓動服務器進程並返回。 如果端口被佔用,則應該說「無法綁定到該端口」並返回。如果服務器啓動,它應該打印「綁定到端口51231」並返回。但它不會返回。叉和退出在Python

import socket 
from multiprocessing import Process 

def serverMainLoop(s,t): 
    s.listen(5) 
    while 1: 
     pass # server goes here 

host = '' 
port = 51231 
so = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

try: 
    so.bind((host,port)) 
    print "Bound to port %i"%port 
    serverProcess = Process(target=serverMainloop, args=(so,60)) 
    serverProcess.start() 
    sys.exit() 
except socket.error, (value,message): 
    if value==98: 
     print "couldn't bind to that port" 
    sys.exit() 

是否有一些開關可以導致多處理讓我這麼做?

+0

代碼工作與我同你所描述的: 第一次運行掛起,如果我跑了兩次,第二個實例顯示「無法綁定到該端口」,然後退出。那麼,你的問題是什麼? – theomega 2010-07-28 18:12:58

+0

我不希望第一個掛起,我希望它返回並打印它綁定的端口,而不會終止正在循環的子進程。 – Nathan 2010-07-28 18:20:27

回答

4

查看this頁面,它描述瞭如何使用os.fork()os._exit(1)構建一個守護程序,該守護程序會分叉到後臺。

的你也許想會是一個原型:

pid = os.fork() 
if (pid == 0): # The first child. 
    os.chdir("/") 
    os.setsid() 
    os.umask(0) 
    pid2 = os.fork() 
    if (pid2 == 0): # Second child 
    # YOUR CODE HERE 
    else: 
    sys.exit() #First child exists 
else:   # Parent Code 
    sys.exit() # Parent exists 

爲什麼到餐桌兩次see this問題(精簡版的原因:它給孤兒的孩子,並使其在init進程的孩子需要)

+0

爲什麼分叉兩次? – Nathan 2010-07-28 18:43:27

+0

http://stackoverflow.com/questions/881388/what-is-the-reason-for-performing-a-double-fork-when-creating-a-daemon – theomega 2010-07-28 21:44:38

+0

注意。您可能通常更喜歡os._exit在子進程的末尾,以避免關閉父進程擁有的對象的副本(例如文件描述符) – user48956 2017-03-09 23:02:28

1

做你的描述,我不會用多,我會考慮寫一個daemon

0

作爲編寫守護程序的替代方法,只需將您的程序編寫爲控制檯進程(如此測試),然後使用服務管理應用程序(如supervisord)將其作爲服務運行即可。 Supervisord還可以做更多事情,只是將您的程序作爲服務運行。它將監控,重新啓動,記錄,報告狀態和狀態變化,甚至提供最小的網絡界面來管理您的流程。

+0

我會這樣做,但我需要登錄到具有未知配置的遠程計算機,上傳服務器,啓動它並離開。這是從一個Windows GUI應用程序內完成的。 – Nathan 2010-07-28 18:50:06