демон python - почему эта функция убивает родителя дважды? - PullRequest
0 голосов
/ 26 июня 2018
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 Ответ

0 голосов
/ 28 июня 2018

Фраза «двойная вилка» является стандартной техникой, обеспечивающей повторное создание демона в процессе init (pid 1), чтобы оболочка, которая его запустила, не уничтожала его. Это фактически использует эту технику, потому что первый форк выполняется процессом, который запустил программу python. Когда программа вызывает daemon_start, она разветвляется. Исходный (теперь родительский) процесс завершается через несколько секунд или раньше, когда его разветвляет дочерний процесс. Это заставит ядро ​​переписать дочерний процесс на pid 1. «Двойная вилка» не означает, что демон дважды вызывает fork().

Кроме того, ваша строка темы спрашивает "почему эта функция убивает родителя дважды?" Но рассматриваемый код не делает такой вещи. Я понятия не имею, откуда у вас эта идея.

...