From dc979f042c6466ca12e72083e689333b33e19a59 Mon Sep 17 00:00:00 2001 From: Miguel Xavier Penha Neto Date: Wed, 2 Dec 2015 14:59:00 -0200 Subject: [PATCH] Fix log files when daemonizing Save log file descriptor so it's not closed when calling daemonize() --- websockify/websocket.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/websockify/websocket.py b/websockify/websocket.py index 0054f53..0f8e25e 100644 --- a/websockify/websocket.py +++ b/websockify/websocket.py @@ -748,6 +748,10 @@ class WebSocketServer(object): @staticmethod def daemonize(keepfd=None, chdir='/'): + + if keepfd is None: + keepfd = [] + os.umask(0) if chdir: os.chdir(chdir) @@ -770,7 +774,7 @@ class WebSocketServer(object): if maxfd == resource.RLIM_INFINITY: maxfd = 256 for fd in reversed(range(maxfd)): try: - if fd != keepfd: + if fd not in keepfd: os.close(fd) except OSError: _, exc, _ = sys.exc_info() @@ -937,6 +941,18 @@ class WebSocketServer(object): # Original socket closed by caller client.close() + def get_log_fd(self): + """ + Get file descriptors for the loggers. + They should not be closed when the process is forked. + """ + descriptors = [] + for handler in self.logger.parent.handlers: + if isinstance(handler, logging.FileHandler): + descriptors.append(handler.stream.fileno()) + + return descriptors + def start_server(self): """ Daemonize if requested. Listen for for connections. Run @@ -952,7 +968,9 @@ class WebSocketServer(object): tcp_keepintvl=self.tcp_keepintvl) if self.daemon: - self.daemonize(keepfd=lsock.fileno(), chdir=self.web) + keepfd = self.get_log_fd() + keepfd.append(lsock.fileno()) + self.daemonize(keepfd=keepfd, chdir=self.web) self.started() # Some things need to happen after daemonizing