python 創建守護進程
- python 的os.setdid()提供了類似linux c api的 setsid
- 也可以通過unix雙fork創建守護進程。
幾個相關的函數
- os.umask(0) #重設文件創建掩碼,子進程會從父進程繼承所有權限,可以通過調用這個方法將文件創建掩碼初始化成系統默認。
- os.setsid() #調用系統的setsid(),創建一個新的會話並創建組id
#!/usr/bin/env python #coding:utf8 import sys, os def main(): """ A demo daemon main routine, write a datestamp to /tmp/daemon-log every 10 seconds. """ import time f = open("/tmp/daemon-log", "w") while 1: f.write('%s/n' % time.ctime(time.time())) f.flush() time.sleep(10) if __name__ == "__main__": # do the UNIX double-fork magic, see Stevens' "Advanced # Programming in the UNIX Environment" for details (ISBN 0201563177) try: pid = os.fork() if pid > 0: # exit first parent sys.exit(0) except OSError, e: print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) # decouple from parent environment os.chdir("/") os.setsid() os.umask(0) # do second fork try: pid = os.fork() if pid > 0: # exit from second parent, print eventual PID before print "Daemon PID %d" % pid sys.exit(0) except OSError, e: print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) # start the daemon main loop main()
代碼引用自從:http://code.activestate.com/recipes/66012/download/1/
- main為寫時間戳的永久循環
- 運行后程序fork一個進程,如果fork成功則程序自己退出
- 通過setsid() 創建了一個獨立於當前會話的進程
- 再一次fork一個進程,如果fork成功則當前程序退出
- 這時候進程的父進程就變成了 init,成為了一個獨立的deamon