您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

从python生成过程

从python生成过程

正如@mark所阐明的那样,它是一个Linux系统,通过遵循此食谱,脚本可以轻松地使其自身完全独立,即守护程序 。(您也可以在子进程之后,然后在子进程中在父进程中执行此操作)。os.fork``os.exec...

编辑:澄清一些细节wrt @mark对我的回答的评论:不需要超级用户权限即可按照菜谱配方“守护”进程,也无需更改当前工作目录(尽管配方确实可以做到这一点,而且,这不是关键部分- 而是fork_exitsetsid调用的正确逻辑顺序。 不会 在父进程环境中使用的各种os.exec...变体都 不会 终止e,因此这部分也很容易- 请参阅Python在线文档

解决在其他人的评论和答案中提出的建议:我相信subprocess并且multiprocessing本身不会守护子进程,这似乎是@mark所需要的;该脚本可以自己完成操作,但是由于某些 代码必须执行forks和setsid,所以对我而言,将所有生成都保留在该低层平面上似乎比较整洁,而不是在其中混合一些高层和一些低层代码手术过程。

这是上述URL处配方的大大简化版本,专门用于在父级中调用生成守护程序子级—这样,该代码也可以用于执行非Python可执行文件。如给定的那样,该代码应满足@mark解释的需求,当然可以通过多种方式对其进行定制- 我强烈建议阅读原始配方及其注释和讨论以及其推荐的书,以获取更多信息。

import os
import sys

def spawnDaemon(path_to_executable, *args)
    """Spawn a completely detached subprocess (i.e., a daemon).

    E.g. for mark:
    spawnDaemon("../bin/producenotify.py", "producenotify.py", "xx")
    """
    # fork the first time (to make a non-session-leader child process)
    try:
        pid = os.fork()
    except OSError, e:
        raise RuntimeError("1st fork Failed: %s [%d]" % (e.strerror, e.errno))
    if pid != 0:
        # parent (calling) process is all done
        return

    # detach from controlling terminal (to make child a session-leader)
    os.setsid()
    try:
        pid = os.fork()
    except OSError, e:
        raise RuntimeError("2nd fork Failed: %s [%d]" % (e.strerror, e.errno))
        raise Exception, "%s [%d]" % (e.strerror, e.errno)
    if pid != 0:
        # child process is all done
        os._exit(0)

    # grandchild process Now non-session-leader, detached from parent
    # grandchild process must Now close all open files
    try:
        maxfd = os.sysconf("SC_OPEN_MAX")
    except (AttributeError, ValueError):
        maxfd = 1024

    for fd in range(maxfd):
        try:
           os.close(fd)
        except OSError: # ERROR, fd wasn't open to begin with (ignored)
           pass

    # redirect stdin, stdout and stderr to /dev/null
    os.open(os.devnull, os.O_RDWR)  # standard input (0)
    os.dup2(0, 1)
    os.dup2(0, 2)

    # and finally let's execute the executable for the daemon!
    try:
      os.execv(path_to_executable, args)
    except Exception, e:
      # oops, we're cut off from the world, let's just give up
      os._exit(255)
python 2022/1/1 18:43:42 有291人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶