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

本文详细介绍了如何使用Python实现守护进程,并处理SIGHUP、SIGINT、SIGTERM信号,确保程序在接收到特定信号时能优雅退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#!/usr/bin/python
#
importsys
importos
importtime
importatexit
importsignal
 
 
classPyDaemon(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
     
   defdelpid(self):
        try:
            os.remove(self.pidfile)
            print"pid file removed succ"
        exceptOSError as err:
            print'pid file removed failed,',err
 
 
   defdaemonize(self):
        try:
            pid=os.fork()
            ifpid > 0:
                sys.exit(0)
        exceptOSError 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()
            ifpid > 0:
                sys.exit(0)
        exceptOSError 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:
            withopen(self.pidfile,'w+') as pf:
                print>>pf,'%s'% pid
        exceptOSError as err:
            printsys.exc_info()[:2]
            sys.exit(1)
        pid=os.getpid()
        print'Now run pydaemon,pid %d' % pid
 
 
defsignal_handler(signum,stack):
   globalis_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
 
 
defmain():
   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)
   whileTrue:
        try:
            fd.write('%s\n'% time.ctime())
            fd.flush()
            time.sleep(3)
            ifis_signal_up:
                fd.close()
                print"Exit"
                break
        exceptException as e:
            fd.close()
            print"Exit"
            break
         
          
if__name__ =="__main__":
   main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值