Loading cloudcontrol/node/utils.py +43 −0 Original line number Diff line number Diff line import os import sys import errno import resource import subprocess from collections import deque Loading Loading @@ -94,3 +98,42 @@ class Singleton(type): cls._instance = super(Singleton, cls).__call__(*args, **kwargs) return cls._instance def close_fds(exclude_fds=None, debug=False): """Close all fds uneeded fds in child when using fork. :param exclude_fds: list of file descriptors that should not be closed (0, 1, 2 must not be set here, see debug) :param bool debug: indicates if std in/out should be left open (usually for debuging purpose) """ # get max fd limit = resource.getrlimit(resource.RLIMIT_NOFILE)[1] if limit == resource.RLIM_INFINITY: max_fd = 2048 else: max_fd = limit if exclude_fds is None: exclude_fds = [] if debug: exclude_fds += [0, 1, 2] # debug for fd in xrange(max_fd, -1, -1): if fd in exclude_fds: continue try: os.close(fd) except OSError as exc: if exc.errno != errno.EBADF: raise # wasn't open if not debug: sys.stdin = open(os.devnull) sys.stdout = open(os.devnull) sys.stderr = open(os.devnull) assert sys.stdin.fileno() == 0 assert sys.stdout.fileno() == 1 assert sys.stderr.fileno() == 2 Loading
cloudcontrol/node/utils.py +43 −0 Original line number Diff line number Diff line import os import sys import errno import resource import subprocess from collections import deque Loading Loading @@ -94,3 +98,42 @@ class Singleton(type): cls._instance = super(Singleton, cls).__call__(*args, **kwargs) return cls._instance def close_fds(exclude_fds=None, debug=False): """Close all fds uneeded fds in child when using fork. :param exclude_fds: list of file descriptors that should not be closed (0, 1, 2 must not be set here, see debug) :param bool debug: indicates if std in/out should be left open (usually for debuging purpose) """ # get max fd limit = resource.getrlimit(resource.RLIMIT_NOFILE)[1] if limit == resource.RLIM_INFINITY: max_fd = 2048 else: max_fd = limit if exclude_fds is None: exclude_fds = [] if debug: exclude_fds += [0, 1, 2] # debug for fd in xrange(max_fd, -1, -1): if fd in exclude_fds: continue try: os.close(fd) except OSError as exc: if exc.errno != errno.EBADF: raise # wasn't open if not debug: sys.stdin = open(os.devnull) sys.stdout = open(os.devnull) sys.stderr = open(os.devnull) assert sys.stdin.fileno() == 0 assert sys.stdout.fileno() == 1 assert sys.stderr.fileno() == 2