#!/usr/bin/env python #+ # NAME: # skyd # PURPOSE: # Used to set up the indexing script skyd_wait.py as a # daemon process. # skyd.py should not be called directly, but # should be controlled with the bash script skyd. # MODIFICATION HISTORY: #- import sys, os ########################################################################### HOST=((os.environ['HOSTNAME']).split('.'))[0] ROOT=os.environ['SKYD'] LOGFILE = os.path.join(ROOT,'log','skyd_'+HOST+'.log') PIDFILE = os.path.join(ROOT,'run','skyd_'+HOST+'.pid') CFFILE = os.path.join(ROOT,'cf','skyd_'+HOST+'.cf') import skyd_wait USERPROG = skyd_wait.skyd_wait ########################################################################### #based on Jrgen Hermanns http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012 class Log: """file like for writes with auto flush after each write to ensure that everything is logged, even during an unexpected exit.""" def __init__(self, f): self.f = f def write(self, s): self.f.write(s) self.f.flush() def main(): #change to data directory if needed #os.chdir("/root/data") #redirect outputs to a logfile sys.stdout = sys.stderr = Log(open(LOGFILE, 'a+')) #ensure the that the daemon runs a normal user #os.setegid(100) #(103) #set group first "pydaemon" #os.seteuid(500) #(103) #set user "pydaemon" USERPROG(CFFILE) #start the user program here: if __name__ == "__main__": # do the UNIX double-fork magic, see Stevens' "Advanced # Programming in the UNIX Environment" for details (ISBN 0201563177) try: pid = os.fork() if pid > 0: # exit first parent sys.exit(0) except OSError, e: print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) # decouple from parent environment os.chdir("/") #don't prevent unmounting.... os.setsid() os.umask(0) # do second fork try: pid = os.fork() if pid > 0: # exit from second parent, print eventual PID before #print "Daemon PID %d" % pid open(PIDFILE,'w').write("%d"%pid) sys.exit(0) except OSError, e: print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) main() # start the daemon main loop