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
