【问题标题】:python daemon - why does this function kill parent twice?python daemon - 为什么这个函数会杀死父级两次?
【发布时间】:2018-12-04 23:52:11
【问题描述】:
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) 退出父。

这样做是什么意思?

【问题讨论】:

    标签: python linux unix daemon


    【解决方案1】:

    短语“双叉”是一种标准技术,可确保将守护进程重新设置为 init (pid 1) 进程的父进程,以便启动它的 shell 不会杀死它。这实际上是在使用该技术,因为第一个 fork 是由启动 python 程序的进程完成的。当程序调用daemon_start 时,它会分叉。当它派生的子进程发出信号时,原始(现在的父)进程会在几秒钟后或更快退出。这将导致内核将子进程重新设置为 pid 1。“双叉”并不意味着守护进程调用 fork() 两次。

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

    【讨论】:

      猜你喜欢
      • 2016-11-01
      • 1970-01-01
      • 2015-06-22
      • 2014-01-22
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多