2010-07-28 58 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