python daemon 守护进程对信号的处理

#!/usr/bin/python
#
import sys
import os
import time
import atexit
import signal


class PyDaemon(object):
    def __init__(self,pidfile,stdin='/dev/null',stdout='/dev/null',stderr='/dev/null'):
        self.pidfile=pidfile
        self.stdin=stdin
        self.stdout=stdout
        self.stderr=stderr
    
    def delpid(self):
        try:
            os.remove(self.pidfile)
            print "pid file removed succ"
        except OSError as err:
            print 'pid file removed failed,',err


    def daemonize(self):
        try:
            pid=os.fork()
            if pid > 0:
                sys.exit(0)
        except OSError as err:
            sys.stderr.write('fork #1 failed: %d (%s)\n' % (err.errno,e.strerror))
            sys.exit(1)
    
        os.chdir('/')
        os.setsid()
        os.umask(0)
        try:
            pid = os.fork()
            if pid > 0:
                sys.exit(0)
        except OSError as err:
            sys.stderr.write('fork #2 failed: %d (%s)\n' % (e.errno,e.strerror))
            sys.exit(1)
    
        atexit.register(self.delpid)
        pid=unicode(os.getpid())
        try:
            with open(self.pidfile,'w+') as pf:
                print >>pf,'%s' % pid
        except OSError as err:
            print sys.exc_info()[:2]
            sys.exit(1)
        pid=os.getpid()
        print 'Now run pydaemon,pid %d' % pid


def signal_handler(signum,stack):
    global is_signal_up
    is_signal_up=True
    print "received signal:",signum


signal.signal(signal.SIGHUP,signal_handler)
signal.signal(signal.SIGINT,signal_handler) 
signal.signal(signal.SIGTERM,signal_handler)
#signal.signal(signal.SIGKILL,signal_handler)
is_signal_up=False


def main():
    pidfile='/tmp/pydaemon.pid'
    outfile='/tmp/pydaemon.out'
    logfile='/tmp/pydaemon.log'
    daemon=PyDaemon(pidfile,'/dev/null',logfile,logfile)
    daemon.daemonize()
    fd=file(outfile,'a+',0)
    while True:
        try:
            fd.write('%s\n' % time.ctime())
            fd.flush()
            time.sleep(3)
            if is_signal_up:
                fd.close()
                print "Exit"
                break
        except Exception as e:
            fd.close()
            print "Exit"
            break
        
         
if __name__ == "__main__":
    main()

转载于:https://my.oschina.net/chenlei123/blog/121804

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值