用python模擬linux的守護進程,本篇主要模擬過程。不過也能夠用現成的庫來直接編寫python版的守護進程程序。 python
參考代碼以下: linux
#!/usr/bin/python import sys,os,time,atexit from signal import SIGTERM class daemon(): def __init__(self,pidfile,stdin='/dev/null',stdout='/dev/null',stderr='/dev/null'): self.stdin=stdin self.stdout=stdout self.stderr=stderr self.pidfile=pidfile def daemonize(self): #第一次fork,生成子進程,脫離父進程 try: pid=os.fork() if pid > 0: sys.exit(0) except OSError,e: sys.stderr.write("fork fist faild:%d (%s)\n" % (e.errno,e.strerror)) sys.exit(1) #修改工做目錄 os.chdir('/') #設置新的會話鏈接 os.setsid() #從新設置文件建立權限 os.umask(0) #第二次fork,禁止進程打開終端 try: pid=os.fork() if pid > 0: sys.exit(0) except OSError,e: sys.stderr.write("fork second faild:%d (%s)\n" % (e.errno,e.strerror)) sys.exit(1) sys.stdout.flush() sys.stderr.flush() #重定向標準輸入、輸出 si=file(self.stdin,'r') so=file(self.stdout,'a+') se=file(self.stderr,'a+',0) os.dup2(si.fileno(),sys.stdin.fileno()) os.dup2(so.fileno(),sys.stdout.fileno()) os.dup2(se.fileno(),sys.stderr.fileno()) #註冊退出函數 atexit.register(self.delpid) pid=str(os.getpid()) file(self.pidfile,'w+').write("%s\n" % pid) def delpid(self): os.remove(self.pidfile) def start(self): try: pf=open(self.pidfile,'r') pid=int(pf.read().strip()) pf.close() except IOError: pid=None if pid: ms="pidfile %s already exist,daemon already running\n" sys.stderr.write(ms % self.pidfile) sys.exit(1) self.daemonize() self.run() def stop(self): try: pf=open(self.pidfile,'r') pid=int(pf.read().strip()) pf.close() except IOError: pid=None if not pid: ms="pidfile %s does not exit,daemon not running\n" sys.stderr.write(ms % self.pidfile) return try: while 1: os.kill(pid,SIGTERM) time.sleep(0.1) os.remove(self.pidfile) except OSError,err: err=str(err) if err.find('No sush process') > 0: if os.path.exists(self.pidfile): os.remove(self.pidfile) else: print str(err) sys.exit(1) def restart(self): self.stop() self.start() #該方法用於在子類中從新定義,用來運行你的程序 def run(self): """ run your fun""" ###以上代碼能夠作成一個庫文件,也能夠放在一個文件中### ###如下代碼能夠引用上面的庫文件######### class mydaemon(daemon): #從新定義run函數,以運行你的功能 def run(self): while True: fp=open('/tmp/result','a+') fp.write('Hello Guol\n') time.sleep(2) if __name__ == '__main__': daemon=mydaemon('/tmp/pidfile',stdout='/tmp/result') if len(sys.argv) == 2: if 'start' == sys.argv[1]: daemon.start() elif 'stop' == sys.argv[1]: daemon.stop() elif 'restart' == sys.argv[1]: daemon.restart() else: print 'unkonow command' sys.exit(2) sys.exit(0) else: print "usage:%s start/stop/restart" % sys.argv[0] sys.exit(2)運行:
原版代碼接:http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/ 函數
或者能夠直接使用python-daemon庫來建立python版本的守護進程。 spa