A little tech talk for rannts#16 meetup on correct daemonization in UNIXes before systed era
Правильная демонизацияСергей Архипов, 2017
View Slide
Чего хотим#!/usr/bin/env python3# -*- coding: utf-8 -*-import contextlibimport syslogimport time@contextlib.contextmanagerdef daemonize():yieldif __name__ == "__main__":with daemonize():syslog.openlog(facility=syslog.LOG_USER)syslog.syslog("Daemon start.")time.sleep(10)syslog.syslog("Daemon done.")
Подход 1def daemonize():first_pid = os.fork()if first_pid:sys.exit(0)yield
Подход 2def daemonize():first_pid = os.fork()if first_pid:sys.exit(0)syslog.syslog("Session={0}, Group={1}, Parent={2},Self={3}".format(os.getsid(0), os.getpgid(0), os.getppid(),os.getpid()))yield… Session=7087, Group=14115, Parent=14115, Self=14151… Daemon start.… Daemon done.
Подход 2def daemonize():first_pid = os.fork()if first_pid:sys.exit(0)syslog.syslog("Session={0}, Group={1}, Parent={2}, Self={3}".format(os.getsid(0), os.getpgid(0),os.getppid(), os.getpid()))os.setsid()syslog.syslog("Session={0}, Group={1}, Parent={2}, Self={3}".format(os.getsid(0), os.getpgid(0),os.getppid(), os.getpid()))yield… Session=7087, Group=17364, Parent=17364, Self=17400… Session=17400, Group=17400, Parent=17364, Self=17400… Daemon start… Daemon done.
Подход 3def daemonize():if os.fork():sys.exit(0)os.setsid()if os.fork():sys.exit(0)yield
Подход 4def daemonize():if os.fork():sys.exit(0)os.setsid()if os.fork():sys.exit(0)os.chdir("/")os.umask(0o002)yield
Подход 5def daemonize():if os.fork():sys.exit(0)os.setsid()if os.fork():sys.exit(0)os.chdir("/")os.umask(0o002)sys.stdout.flush()sys.stderr.flush()_, max_fds = resource.getrlimit(resource.RLIMIT_NOFILE)max_fds = max_fds if max_fds!=resource.RLIM_INFINITY else 1024os.closerange(0, max_fds)sys.stdout = sys.stderr = open(os.devnull, "w")sys.stdin = open(os.devnull, "r")yield
Подход 6def daemonize():if os.getppid() != 1:returnif os.fork():sys.exit(0)os.setsid()if os.fork():sys.exit(0)os.chdir("/")os.umask(0o002)sys.stdout.flush()sys.stderr.flush()_, max_fds = resource.getrlimit(resource.RLIMIT_NOFILE)max_fds = max_fds if max_fds != resource.RLIM_INFINITY else 1024os.closerange(0, max_fds)sys.stdout = sys.stderr = open(os.devnull, "w")sys.stdin = open(os.devnull, "r")yield
def daemonize():if os.getppid() != 1:returnif os.fork():sys.exit(0)os.setsid()if os.fork():sys.exit(0)os.chdir("/")os.umask(0o002)sys.stdout.flush()sys.stderr.flush()_, max_fds = resource.getrlimit(resource.RLIMIT_NOFILE)max_fds = max_fds if max_fds != resource.RLIM_INFINITY else 1024os.closerange(0, max_fds)sys.stdout = sys.stderr = open(os.devnull, "w")sys.stdin = open(os.devnull, "r")yield