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

python守护进程-为什么这个函数会两次杀死父进程?

  •  0
  • Antiver  · 技术社区  · 6 年前
    def daemon_start(pid_file, log_file):
    
        def handle_exit(signum, _):
            if signum == signal.SIGTERM:
                sys.exit(0)
            sys.exit(1)
    
        signal.signal(signal.SIGINT, handle_exit)
        signal.signal(signal.SIGTERM, handle_exit)
    
        # fork only once because we are sure parent will exit
        pid = os.fork()
        assert pid != -1
    
        if pid > 0:
            # parent waits for its child
            time.sleep(5)
            sys.exit(0)
    
        # child signals its parent to exit
        ppid = os.getppid()
        pid = os.getpid()
        if write_pid_file(pid_file, pid) != 0:
            os.kill(ppid, signal.SIGINT)
            sys.exit(1)
    
        os.setsid()
        signal.signal(signal.SIGHUP, signal.SIG_IGN)
    
        print('started')
    
        os.kill(ppid, signal.SIGTERM)
    
        sys.stdin.close()
        try:
            freopen(log_file, 'a', sys.stdout)
            freopen(log_file, 'a', sys.stderr)
        except IOError as e:
            shell.print_exception(e)
            sys.exit(1)
    

    此守护进程不使用双叉。上面写着“叉子只有一次,因为我们确信父母会退出”。父级调用sys.exit(0)退出。但是子级调用os.kill(ppid,signal.SIGTERM)退出父级。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Kurtis Rader    6 年前

    短语“double fork”是一种标准技术,用于确保将守护进程重新分配给init(pid 1)进程,以便启动它的shell不会杀死它。这实际上是在使用这种技术,因为第一个fork是由启动python程序的进程完成的。当程序调用时 daemon_start fork() 两次。

    另外,主题行会问“为什么这个函数会两次杀死父对象?”但所讨论的代码没有这样的功能。我不知道你是怎么想到的。