[projects/git-slug: 79/170] Initial version of daemon module

glen glen at pld-linux.org
Mon Sep 21 21:45:27 CEST 2015


commit 3c9e8e51a4056cf52dbb4b626d77ffd7e10d0731
Author: Kacper Kornet <draenog at pld-linux.org>
Date:   Mon Mar 12 15:11:59 2012 +0000

    Initial version of daemon module
    
    Downloaded from:
    http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

 Daemon/__init__.py |   1 +
 Daemon/daemon.py   | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 123 insertions(+)
---
diff --git a/Daemon/__init__.py b/Daemon/__init__.py
new file mode 100644
index 0000000..d39a83b
--- /dev/null
+++ b/Daemon/__init__.py
@@ -0,0 +1 @@
+#empty file
diff --git a/Daemon/daemon.py b/Daemon/daemon.py
new file mode 100644
index 0000000..6c1cfbd
--- /dev/null
+++ b/Daemon/daemon.py
@@ -0,0 +1,122 @@
+"""Generic linux daemon base class for python 3.x."""
+
+import sys, os, time, atexit, signal
+
+class daemon:
+        """A generic daemon class.
+
+        Usage: subclass the daemon class and override the run() method."""
+
+        def __init__(self, pidfile): self.pidfile = pidfile
+
+        def daemonize(self):
+                """Deamonize class. UNIX double fork mechanism."""
+
+                try:
+                        pid = os.fork()
+                        if pid > 0:
+                                # exit first parent
+                                sys.exit(0)
+                except OSError as err:
+                        sys.stderr.write('fork #1 failed: {0}\n'.format(err))
+                        sys.exit(1)
+
+                # decouple from parent environment
+                os.chdir('/')
+                os.setsid()
+                os.umask(0
+
+                # do second fork
+                try:
+                        pid = os.fork()
+                        if pid > 0:
+
+                                # exit from second parent
+                                sys.exit(0)
+                except OSError as err:
+                        sys.stderr.write('fork #2 failed: {0}\n'.format(err))
+                        sys.exit(1)
+
+                # redirect standard file descriptors
+                sys.stdout.flush()
+                sys.stderr.flush()
+                si = open(os.devnull, 'r')
+                so = open(os.devnull, 'a+')
+                se = open(os.devnull, 'a+')
+
+                os.dup2(si.fileno(), sys.stdin.fileno())
+                os.dup2(so.fileno(), sys.stdout.fileno())
+                os.dup2(se.fileno(), sys.stderr.fileno())
+
+                # write pidfile
+                atexit.register(self.delpid)
+
+                pid = str(os.getpid())
+                with open(self.pidfile,'w+') as f:
+                        f.write(pid + '\n')
+
+        def delpid(self):
+                os.remove(self.pidfile)
+
+        def start(self):
+                """Start the daemon."""
+
+                # Check for a pidfile to see if the daemon already runs
+                try:
+                        with open(self.pidfile,'r') as pf:
+
+                                pid = int(pf.read().strip())
+                except IOError:
+                        pid = None
+
+                if pid:
+                        message = "pidfile {0} already exist. " + \
+                                        "Daemon already running?\n"
+                        sys.stderr.write(message.format(self.pidfile))
+                        sys.exit(1)
+
+                # Start the daemon
+                self.daemonize()
+                self.run()
+
+        def stop(self):
+                """Stop the daemon."""
+
+                # Get the pid from the pidfile
+                try:
+                        with open(self.pidfile,'r') as pf:
+                                pid = int(pf.read().strip())
+                except IOError:
+                        pid = None
+
+                if not pid:
+                        message = "pidfile {0} does not exist. " + \
+                                        "Daemon not running?\n"
+                        sys.stderr.write(message.format(self.pidfile))
+                        return # not an error in a restart
+
+                # Try killing the daemon process
+                try:
+                        while 1:
+                                os.kill(pid, signal.SIGTERM)
+                                time.sleep(0.1)
+                except OSError as err:
+                        e = str(err.args)
+                        if e.find("No such process") > 0:
+                                if os.path.exists(self.pidfile):
+                                        os.remove(self.pidfile)
+                        else:
+                                print (str(err.args))
+                                sys.exit(1)
+
+        def restart(self):
+                """Restart the daemon."""
+                self.stop()
+                self.start()
+
+        def run(self):
+                """You should override this method when you subclass Daemon.
+
+                It will be called after the process has been daemonized by
+                start() or restart()."""
+
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/projects/git-slug.git/commitdiff/4ed64f73960519a2f4fd04c42950b2c96ae795c5



More information about the pld-cvs-commit mailing list