如何在Python中实现守护进程?

如何在Python中实现守护进程?,python,multiprocessing,daemon,Python,Multiprocessing,Daemon,我正在写一个小程序,它有心跳进程和回音进程。我用一个多处理库实现了这一点,但它似乎不起作用 from multiprocessing import Process import os import time def ticking(): while True: time.sleep(1) print 'ticking' def echo(): while True: a = raw_input('please type some

我正在写一个小程序,它有心跳进程和回音进程。我用一个多处理库实现了这一点,但它似乎不起作用

from multiprocessing import Process
import os
import time

def ticking():
    while True:
        time.sleep(1)
        print 'ticking'

def echo():
    while True:
        a = raw_input('please type something')
        print 'echo: ' + a

if __name__ == '__main__':
    p = Process(target=ticking, args=())
    p.start()
    p.join()

    p = Process(target=echo, args=())
    p.start()
    p.join()

您创建了一个将永远运行的进程,并将其添加到该进程中。第二个进程永远不会被创建,因为
join()
将永远暂停主进程

如果这是您想要继续的方式,那么您应该首先创建这两个进程,然后将它们连接起来:

if __name__ == '__main__':
    p1 = Process(target=ticking, args=())
    p1.start()

    p2 = Process(target=echo, args=())
    p2.start()

    p1.join()
    p2.join()

要创建守护程序,可以使用以下函数:

def daemonize():
    """UNIX double fork mechanism."""
    try:
        pid = os.fork()
        if pid > 0:
            # exit first parent
            sys.exit(0)
    except OSError as err:
        sys.stderr.write('_Fork #1 failed: {0}\n'.format(err))
        sys.exit(1)
    # decouple from parent environment
    os.chdir('/')
    os.setsid()
    os.umask(0)
    # do second fork
    try:
        pid = os.fork()
        if pid > 0:
            # exit from second parent
            sys.exit(0)
    except OSError as err:
        sys.stderr.write('_Fork #2 failed: {0}\n'.format(err))
        sys.exit(1)
    # redirect standard file descriptors
    sys.stdout.flush()
    sys.stderr.flush()
    si = open(os.devnull, 'r')
    so = open(os.devnull, 'w')
    se = open(os.devnull, 'w')
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(se.fileno(), sys.stderr.fileno())

文件。“该方法会一直阻塞,直到调用join()方法的进程终止。”是的,但结果是一样的:p顺便说一句,该库是一个方便的包,可以轻松创建守护进程。大家都同意,
多处理
不是实现守护进程的正确工具。一般来说,您希望对Unix守护程序使用双分叉习惯用法,因此只需使用链接的库地毯吸烟者即可。@地毯吸烟者谢谢,将尝试:)阅读后,我不明白为什么要执行
os.setsid()
。但是为什么要做(1)
os.chdir('/')
(2)
os.umask(0)
(3)文件描述符之类的事情呢?如果我不做其中一些呢?我们也可以用python做类似的事情吗?@Mahesha999 1。我们需要把工作目录换成一个安全的地方。例如,将来可能会卸载运行应用程序的目录。根目录是最好的方法。2.umask(0)允许对守护进程将创建的文件进行完全访问(-rw-rw-)。3.当守护进程与终端断开连接时,我们关闭文件描述符,并且不应该通过管道发送任何数据。为此,我们打开/dev/null并将守护进程的文件描述符更改为/dev/null描述符。@Mahesha999我们做所有这些事情,因为这些是创建守护进程的规则:我演示了如何通过一个函数将应用程序转换为守护进程。此方法仅依赖于sys和os模块。在python中还存在其他创建unix守护进程的方法,这只是其中之一。