some fixes. still dont handle SIGQUIT on workers :/

This commit is contained in:
Benoit Chesneau 2010-01-30 00:56:09 +01:00
parent 6d4ef85e39
commit ced1f39020
3 changed files with 28 additions and 27 deletions

View File

@ -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:

View File

@ -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()

View File

@ -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)