動機

碰到daemonize來記錄一下

SID, PGID

  • process都有一個pid
  • 一堆process可以組成process group,就會有一個pgid
    • group收到的signal會送給旗下所有的process
  • 一堆process group可以組成session,就會有一個sid
    • session會綁定到一個tty

daemonize

daemon的目的

  1. 在背景執行
  2. 獨立於其他session (自成一體)
  3. tty不見了也要能動 (獨立於tty)

所以daemonize的步驟是

  1. fork一個子process
  2. 讓父process退出 (子process現在與父process無關,在背景執行)
  3. 在子process創立新的session (獨立於其他session)
  • 因為是該session的第一個session,所以會與tty綁定
  • 另外,此時也可以
    1. 把不需要fd關掉
    2. 把umask設好,也許parent的不符合daemon的需求
  1. fork一個子process (獨立於tty)
try:
    pid = os.fork()
    if pid > 0:
        # Exit first parent
        sys.exit(0)
except OSError as e:
    sys.stderr.write(
        "fork #1 failed: %d (%s)\n" % (e.errno, e.strerror))
    sys.exit(1)

# Decouple from parent environment
os.chdir(self.home_dir)
os.setsid()
os.umask(self.umask)

# Do second fork
try:
    pid = os.fork()
    if pid > 0:
        # Exit from second parent
        sys.exit(0)
except OSError as e:
    sys.stderr.write(
        "fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))
    sys.exit(1)

Ref

Daemonize 一个进程为什么需要 fork 两次