【问题标题】:Python server daemon not workingPython服务器守护进程不工作
【发布时间】:2015-06-21 04:10:54
【问题描述】:

我需要让一个基本的 python 服务器作为守护进程运行,但是当我将线程设置为作为守护进程运行时,套接字不再监听。我尝试与客户端连接以向其发送文件,但出现连接错误。当我省略将其设置为守护进程的部分时,它工作得很好。建议?谢谢

服务器代码:

import socket
import sys
import threading

HOST = "localhost"
PORT = 3000
exit = False

def handle_client(client):
    global exit
    filename = client.recv(50).decode()
    client.send(b"/ok")

    if filename == '':
        client.close()

        return
    elif filename == '/kill':
        exit = True
        client.send(b'killing server...\n')

        killserver = socket.socket()
        killserver.connect((HOST, PORT))
        killserver.close()

        client.send(b'success.\n')
        client.close()

        return

    f = open(filename, "wb")

    data = client.recv(1024)
    while(data):
        f.write(data)
        data = client.recv(1024)
    f.close()

    print("Wrote file " + filename)

    client.close()

def server():
    servsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    servsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    servsock.bind((HOST,PORT))

    print("[INFO]: listening on " + str(PORT))
    servsock.listen(10)

    while True:
        client, addr = servsock.accept()

        if exit is True:
            print("[INFO]: server received kill request")
            break

        print("[INFO]: connection from " + addr[0])

        hc = threading.Thread(target=handle_client, args=(client,))
        hc.start()

    servsock.close()

s = threading.Thread(target=server)
s.setDaemon(True)
s.start()

【问题讨论】:

    标签: python sockets server daemon


    【解决方案1】:

    当只有守护线程在运行时,进程退出。启动线程后,退出主线程。您不希望服务器线程成为守护进程。

    【讨论】:

    • 好的,有没有办法让服务器像常规守护进程一样在后台运行?
    • 这取决于您的操作系统。在 Windows 上,运行 Pythonw.exe 将创建没有控制台的进程。
    • 我正在运行 Linux。我打算把它移到 Ubuntu 服务器上,所以我想从命令行运行它并将它留在后台,这样我就可以运行多个程序。
    • 只需在后台运行该进程即可。不就是在命令中加&吗?