代码之家  ›  专栏  ›  技术社区  ›  Nathan

Python中的Fork和exit

  •  0
  • Nathan  · 技术社区  · 15 年前

    此代码应该尝试启动服务器进程并返回。 如果端口被占用,它应该说“无法绑定到该端口”并返回。如果服务器启动,它应该打印“绑定到端口51231”并返回。但它不会回来。

    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()
    

    3 回复  |  直到 15 年前
        1
  •  4
  •   Community CDub    8 年前

    检查 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进程的子进程)

        2
  •  1
  •   Mark    15 年前
        3
  •  0
  •   Marcelo Cantos    15 年前

    作为编写守护进程的替代方法,只需将您的程序编写为控制台进程(对其进行测试),并使用服务管理应用程序,如 supervisord 将其作为服务运行。Supervisord还可以做更多的事情,只是将您的程序作为服务运行。它将监视、重新启动、记录、报告状态和状态更改,甚至提供一个最小的web界面来管理您的进程。