天天看点

Python 模拟linux守护进程

   用python模拟linux的守护进程,本篇主要模拟过程。不过也可以用现成的库来直接编写python版的守护进程程序。

参考代码如下:

#!/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)                

运行:

Python 模拟linux守护进程

原版代码接:http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

或者可以直接使用python-daemon库来创建python版本的守护进程。

版权声明:本文为CSDN博主「weixin_33704591」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_33704591/article/details/91593048