]> kaliko git repositories - python-daemon.git/blobdiff - src/daemon.py
better error handling
[python-daemon.git] / src / daemon.py
index 7489233bddbb8e84a297cde3b5288cffc480f983..2251f183246a3e23171aeb2412eaf07035f70f04 100644 (file)
@@ -20,6 +20,8 @@ class Daemon(object):
 
     Usage: subclass the Daemon class and override the run() method
     """
+    version = "0.3"
+
     def __init__(self, pidfile,
             stdin='/dev/null',
             stdout='/dev/null',
@@ -28,6 +30,7 @@ class Daemon(object):
         self.stdout = stdout
         self.stderr = stderr
         self.pidfile = pidfile
+        self.umask = 0
 
     def daemonize(self):
         """
@@ -47,7 +50,7 @@ class Daemon(object):
         # Decouple from parent environment
         os.chdir("/")
         os.setsid()
-        os.umask(0)
+        self.umask = os.umask(0)
 
         # Do second fork
         try:
@@ -59,6 +62,7 @@ class Daemon(object):
             sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror))
             sys.exit(1)
 
+        self.write_pid()
         # redirect standard file descriptors
         sys.stdout.flush()
         sys.stderr.flush()
@@ -78,12 +82,14 @@ class Daemon(object):
             return
         pid = str(os.getpid())
         try:
+            os.umask(self.umask)
             file(self.pidfile, 'w').write('%s\n' % pid)
             #except IOError, wpid_err:
         except Exception, wpid_err:
             sys.stderr.write(u'Error trying to write pid file to %s: %s\n' %
                    (unicode(self.pidfile, 'utf-8'), wpid_err))
             sys.exit(1)
+        os.umask(0)
         atexit.register(self.delpid)
 
     def signal_management(self):
@@ -94,7 +100,7 @@ class Daemon(object):
         sys.exit(1)
 
     def delpid(self):
-        os.remove(self.pidfile)
+        os.unlink(self.pidfile)
 
     def start(self):
         """
@@ -113,7 +119,6 @@ class Daemon(object):
             sys.stderr.write(message % self.pidfile)
             sys.exit(1)
 
-        self.write_pid()
         # Start the daemon
         self.daemonize()
         self.run()
@@ -139,7 +144,7 @@ class Daemon(object):
             pid = None
 
         if not pid:
-            message = "pidfile %s does not exist. Daemon not running?\n"
+            message = "pidfile %s does not exist. Is the Daemon running?\n"
             sys.stderr.write(message % self.pidfile)
             return  # not an error in a restart
 
@@ -148,10 +153,9 @@ class Daemon(object):
             os.kill(pid, SIGTERM)
             time.sleep(0.1)
         except OSError, err:
-            err = str(err)
-            if err.find("No such process") > 0:
+            if err.errno == 3:
                 if os.path.exists(self.pidfile):
-                    message = "Daemon not running? removing pid file %s.\n"
+                    message = "Daemon's not running? removing pid file %s.\n"
                     sys.stderr.write(message % self.pidfile)
                     os.remove(self.pidfile)
             else: