New version: 2.1.
Now we can optionally keep some FDs open.
This commit is contained in:
		@@ -23,3 +23,6 @@ You can install it from Python Package Index (PyPI):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    daemon = Daemonize(app="test_app", pid=pid, action=main)
 | 
					    daemon = Daemonize(app="test_app", pid=pid, action=main)
 | 
				
			||||||
    daemon.start()
 | 
					    daemon.start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## File descriptors
 | 
				
			||||||
 | 
					Daemonize object's constructor understands the optional argument **keep_fds** which can contain a list of fds which should remain open. TODO: explain it more.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								daemonize.py
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								daemonize.py
									
									
									
									
									
								
							@@ -16,11 +16,14 @@ class Daemonize(object):
 | 
				
			|||||||
    - app: contains the application name which will be sent to syslog
 | 
					    - app: contains the application name which will be sent to syslog
 | 
				
			||||||
    - pid: path to the pidfile
 | 
					    - pid: path to the pidfile
 | 
				
			||||||
    - action: your custom function which will be executed after daemonization.
 | 
					    - action: your custom function which will be executed after daemonization.
 | 
				
			||||||
 | 
					    - keep_fds: optional list of fds which should remain open
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    def __init__(self, app, pid, action):
 | 
					    def __init__(self, app, pid, action, keep_fds=None):
 | 
				
			||||||
        self.app = app
 | 
					        self.app = app
 | 
				
			||||||
        self.pid = pid
 | 
					        self.pid = pid
 | 
				
			||||||
        self.action = action
 | 
					        self.action = action
 | 
				
			||||||
 | 
					        if keep_fds:
 | 
				
			||||||
 | 
					            self.keep_fds = keep_fds
 | 
				
			||||||
        # Initialize logging.
 | 
					        # Initialize logging.
 | 
				
			||||||
        self.logger = logging.getLogger(self.app)
 | 
					        self.logger = logging.getLogger(self.app)
 | 
				
			||||||
        self.logger.setLevel(logging.DEBUG)
 | 
					        self.logger.setLevel(logging.DEBUG)
 | 
				
			||||||
@@ -72,7 +75,8 @@ class Daemonize(object):
 | 
				
			|||||||
            # Uh oh, there was a problem.
 | 
					            # Uh oh, there was a problem.
 | 
				
			||||||
            sys.exit(1)
 | 
					            sys.exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Close file descriptors
 | 
					        # Close all file descriptors, except the ones mentioned in
 | 
				
			||||||
 | 
					        # self.keep_fds.
 | 
				
			||||||
        devnull = "/dev/null"
 | 
					        devnull = "/dev/null"
 | 
				
			||||||
        if hasattr(os, "devnull"):
 | 
					        if hasattr(os, "devnull"):
 | 
				
			||||||
            # Python has set os.devnull on this system, use it instead
 | 
					            # Python has set os.devnull on this system, use it instead
 | 
				
			||||||
@@ -80,10 +84,11 @@ class Daemonize(object):
 | 
				
			|||||||
            devnull = os.devnull
 | 
					            devnull = os.devnull
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for fd in range(resource.getrlimit(resource.RLIMIT_NOFILE)[0]):
 | 
					        for fd in range(resource.getrlimit(resource.RLIMIT_NOFILE)[0]):
 | 
				
			||||||
            try:
 | 
					            if fd not in self.keep_fds:
 | 
				
			||||||
                os.close(fd)
 | 
					                try:
 | 
				
			||||||
            except OSError:
 | 
					                    os.close(fd)
 | 
				
			||||||
                pass
 | 
					                except OSError:
 | 
				
			||||||
 | 
					                    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        os.open(devnull, os.O_RDWR)
 | 
					        os.open(devnull, os.O_RDWR)
 | 
				
			||||||
        os.dup(0)
 | 
					        os.dup(0)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								setup.py
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								setup.py
									
									
									
									
									
								
							@@ -4,7 +4,7 @@ from setuptools import setup, find_packages
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
setup(
 | 
					setup(
 | 
				
			||||||
    name="daemonize",
 | 
					    name="daemonize",
 | 
				
			||||||
    version="2.0",
 | 
					    version="2.1",
 | 
				
			||||||
    py_modules=["daemonize"],
 | 
					    py_modules=["daemonize"],
 | 
				
			||||||
    author="Ilya A. Otyutskiy",
 | 
					    author="Ilya A. Otyutskiy",
 | 
				
			||||||
    author_email="sharp@thesharp.ru",
 | 
					    author_email="sharp@thesharp.ru",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user