動機
碰到daemonize來記錄一下
SID, PGID
- process都有一個pid
- 一堆process可以組成process group,就會有一個pgid
- group收到的signal會送給旗下所有的process
- 一堆process group可以組成session,就會有一個sid
- session會綁定到一個tty
daemonize
daemon的目的
- 在背景執行
- 獨立於其他session (自成一體)
- tty不見了也要能動 (獨立於tty)
所以daemonize的步驟是
- fork一個子process
- 讓父process退出 (子process現在與父process無關,在背景執行)
- 在子process創立新的session (獨立於其他session)
- 因為是該session的第一個session,所以會與tty綁定
- 另外,此時也可以
- 把不需要fd關掉
- 把umask設好,也許parent的不符合daemon的需求
- 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)