Python 模擬linux守護進程

   用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

相關文章
相關標籤/搜索