diff --git a/gunicorn/arbiter.py b/gunicorn/arbiter.py index 88a7e1cb..e78612ba 100644 --- a/gunicorn/arbiter.py +++ b/gunicorn/arbiter.py @@ -95,15 +95,13 @@ class Arbiter(object): def valid_pidfile(self, path): try: with open(path, "r") as f: - try: - pid = int(f.read()) - except: - return None - if pid <= 0: return None + wpid = int(f.read() or 0) + + if wpid <= 0: return None try: - os.kill(pid, 0) - return pid + os.kill(wpid, 0) + return wpid except OSError, e: if e[0] == errno.ESRCH: return @@ -144,8 +142,7 @@ class Arbiter(object): self.log.error("should be a non GUNICORN environnement") else: raise - - + for i in range(5): try: sock = self.init_socket(addr) @@ -224,6 +221,7 @@ class Arbiter(object): def handle_chld(self, sig, frame): self.wakeup() + self.reap_workers() def handle_hup(self): self.log.info("Master hang up.") @@ -297,6 +295,7 @@ class Arbiter(object): self.reap_workers() self.kill_workers(signal.SIGKILL) + def reexec(self): self.reexec_pid = os.fork() if self.reexec_pid == 0: @@ -360,16 +359,14 @@ class Arbiter(object): self.log.exception("Exception in worker process.") sys.exit(-1) finally: - worker.tmp.close() self.log.info("Worker %s exiting." % worker_pid) - os._exit(127) def kill_workers(self, sig): for pid in self.WORKERS.keys(): self.kill_worker(pid, sig) def kill_worker(self, pid, sig): - + self.log.info("ici") try: os.kill(pid, sig) except OSError, e: diff --git a/gunicorn/main.py b/gunicorn/main.py index 1f85be62..643dd1cd 100644 --- a/gunicorn/main.py +++ b/gunicorn/main.py @@ -56,7 +56,6 @@ def configure_logging(opts): for h in handlers: h.setFormatter(logging.Formatter("%(levelname)s %(message)s")) logger.addHandler(h) - return logger def daemonize(logger): if not 'GUNICORN_FD' in os.environ: @@ -85,7 +84,7 @@ def daemonize(logger): def main(usage, get_app): parser = op.OptionParser(usage=usage, option_list=options()) opts, args = parser.parse_args() - logger = configure_logging(opts) + configure_logging(opts) app = get_app(parser, opts, args) workers = opts.workers or 1 @@ -110,12 +109,14 @@ def main(usage, get_app): arbiter = Arbiter((host,port), workers, app, **kwargs) if opts.daemon: - daemonize(logger) + daemonize() + else: + os.setpgrp() arbiter.run() def paste_server(app, global_conf=None, host="127.0.0.1", port=None, *args, **kwargs): - logger = configure_logging(opts) + configure_logging(opts) if not port: if ':' in host: host, port = host.split(':', 1) @@ -147,5 +148,7 @@ def paste_server(app, global_conf=None, host="127.0.0.1", port=None, arbiter = Arbiter(bind_addr, workers, app, **kwargs) if daemon == "true": - daemonize(logger) + daemonize() + else: + os.setpgrp() arbiter.run() \ No newline at end of file diff --git a/gunicorn/worker.py b/gunicorn/worker.py index 00c2a7fe..d877ad8c 100644 --- a/gunicorn/worker.py +++ b/gunicorn/worker.py @@ -22,7 +22,7 @@ class Worker(object): SIGNALS = map( lambda x: getattr(signal, "SIG%s" % x), - "HUP QUIT INT TERM TTIN TTOU USR1".split() + "HUP QUIT INT TERM TTIN TTOU USR1 USR2 WINCH".split() ) PIPE = [] @@ -50,7 +50,6 @@ class Worker(object): # prevent inherientence util.close_on_exec(self.socket) - self.socket.setblocking(0) util.close_on_exec(fd) self.address = self.socket.getsockname() @@ -62,18 +61,18 @@ class Worker(object): signal.signal(signal.SIGTERM, self.handle_exit) signal.signal(signal.SIGINT, self.handle_exit) - def handle_usr1(self, *args): + def handle_usr1(self, sig, frame): self.nr = -65536; try: map(lambda p: p.close(), self.PIPE) except: pass - def handle_quit(self, *args): + def handle_quit(self, sig, frame): self.alive = False def handle_exit(self, sig, frame): - os._exit(0) + sys.exit(0) def _fchmod(self, mode): if getattr(os, 'fchmod', None): @@ -112,7 +111,7 @@ class Worker(object): if self.nr == 0: break if self.ppid != os.getppid(): - break + return while self.alive: spinner = (spinner+1) % 2 @@ -120,16 +119,18 @@ class Worker(object): try: ret = select.select([self.socket], [], self.PIPE, self.timeout) - if ret[0]: - break + if ret[0]: break except select.error, e: if e[0] == errno.EINTR: break + if e[0] == errno.EBADF: + if nr >= 0: + return raise spinner = (spinner+1) % 2 - self._fchmod(spinner) - + self._fchmod(spinner) + sys.exit(0) def handle(self, client, addr): util.close_on_exec(client)