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