#python#守护进程的实现,, 找了整天,终于找


技术分享


找了整天,终于找到一个可以用的代码

#!/usr/bin/envpython2.7#encoding:utf-8#@description:一个python守护进程的例子#@tags:python,daemonimportsysimportosimporttimeimportatexitfromsignalimportSIGTERMclassDaemon:"""Agenericdaemonclass.Usage:subclasstheDaemonclassandoverridetherun()method"""def__init__(self,pidfile,stdin=‘/dev/null‘,stdout=‘/dev/null‘,stderr=‘/dev/null‘):self.stdin=stdinself.stdout=stdoutself.stderr=stderrself.pidfile=pidfiledefdaemonize(self):"""dotheUNIXdouble-forkmagic,seeStevens‘"AdvancedProgrammingintheUNIXEnvironment"fordetails(ISBN0201563177)http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16"""try:pid=os.fork()ifpid>0:#exitfirstparentsys.exit(0)exceptOSError,e:sys.stderr.write("fork#1failed:%d(%s)\n"%(e.errno,e.strerror))sys.exit(1)#decouplefromparentenvironmentos.chdir("/")os.setsid()os.umask(0)#dosecondforktry:pid=os.fork()ifpid>0:#exitfromsecondparentsys.exit(0)exceptOSError,e:sys.stderr.write("fork#2failed:%d(%s)\n"%(e.errno,e.strerror))sys.exit(1)#redirectstandardfiledescriptorssys.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())#writepidfileatexit.register(self.delpid)pid=str(os.getpid())file(self.pidfile,‘w+‘).write("%s\n"%pid)defdelpid(self):os.remove(self.pidfile)defstart(self):"""Startthedaemon"""#Checkforapidfiletoseeifthedaemonalreadyrunstry:pf=file(self.pidfile,‘r‘)pid=int(pf.read().strip())pf.close()exceptIOError:pid=Noneifpid:message="pidfile%salreadyexist.Daemonalreadyrunning?\n"sys.stderr.write(message%self.pidfile)sys.exit(1)#Startthedaemonself.daemonize()self.run()defstop(self):"""Stopthedaemon"""#Getthepidfromthepidfiletry:pf=file(self.pidfile,‘r‘)pid=int(pf.read().strip())pf.close()exceptIOError:pid=Noneifnotpid:message="pidfile%sdoesnotexist.Daemonnotrunning?\n"sys.stderr.write(message%self.pidfile)return#notanerrorinarestart#Trykillingthedaemonprocesstry:while1:os.kill(pid,SIGTERM)time.sleep(0.1)exceptOSError,err:err=str(err)iferr.find("Nosuchprocess")>0:ifos.path.exists(self.pidfile):os.remove(self.pidfile)else:printstr(err)sys.exit(1)defrestart(self):"""Restartthedaemon"""self.stop()self.start()defrun(self):"""YoushouldoverridethismethodwhenyousubclassDaemon.Itwillbecalledaftertheprocesshasbeendaemonizedbystart()orrestart()."""classMyDaemon(Daemon):defrun(self):whileTrue:time.sleep(60)print‘daemonruning‘if__name__=="__main__":daemon=MyDaemon("/var/run/demodaemon.pid")iflen(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"Unknowncommand"sys.exit(2)sys.exit(0)else:print"usage:%sstart|stop|restart"%sys.argv[0]sys.exit(2)

收藏一下,实现一个类似系统服务的守护进程代码

用法:

chmod +x XXX.py

XXX.py start/stop/restart


参考自:

http://www.tuicool.com/articles/2ANbym

http://blog.csdn.net/dysj4099/article/details/18219411


#python#守护进程的实现

相关内容

    暂无相关文章

评论关闭