如何在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守护进程的方法,这只是其中之一。