Python中創建守護進程


python 創建守護進程

  • python 的os.setdid()提供了類似linux c api的 setsid
  • 也可以通過unix雙fork創建守護進程。

    幾個相關的函數

  1. os.umask(0) #重設文件創建掩碼,子進程會從父進程繼承所有權限,可以通過調用這個方法將文件創建掩碼初始化成系統默認。
  2. 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/
  1. main為寫時間戳的永久循環
  2. 運行后程序fork一個進程,如果fork成功則程序自己退出
  3. 通過setsid() 創建了一個獨立於當前會話的進程
  4. 再一次fork一個進程,如果fork成功則當前程序退出
  5. 這時候進程的父進程就變成了 init,成為了一個獨立的deamon


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM