Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python守护进程-为什么这个函数两次杀死父进程?_Python_Linux_Unix_Daemon - Fatal编程技术网

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

python守护进程-为什么这个函数两次杀死父进程?,python,linux,unix,daemon,Python,Linux,Unix,Daemon,此守护程序不使用双叉。上面写着“只分叉一次,因为我们确信家长会退出”。父级调用sys.exit(0)退出。但是子级调用os.kill(ppid,signal.SIGTERM)退出父级 执行此操作意味着什么?短语“双叉”是一种标准技术,用于确保将守护程序重新租给init(pid 1)进程,以便启动它的shell不会杀死它。这实际上是在使用这种技术,因为第一个fork是由启动python程序的进程完成的。当程序调用daemon\u start时,它会分叉。最初的(现在是父进程)进程在几秒钟后或更早的

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

执行此操作意味着什么?

短语“双叉”是一种标准技术,用于确保将守护程序重新租给init(pid 1)进程,以便启动它的shell不会杀死它。这实际上是在使用这种技术,因为第一个fork是由启动python程序的进程完成的。当程序调用
daemon\u start
时,它会分叉。最初的(现在是父进程)进程在几秒钟后或更早的时候退出,这时它所分叉的子进程发出信号。这将导致内核将子进程重新分配到pid 1。“Double fork”并不意味着守护进程调用
fork()
两次

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

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)