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