mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
some fixes. still dont handle SIGQUIT on workers :/
This commit is contained in:
parent
6d4ef85e39
commit
ced1f39020
@ -95,15 +95,13 @@ class Arbiter(object):
|
|||||||
def valid_pidfile(self, path):
|
def valid_pidfile(self, path):
|
||||||
try:
|
try:
|
||||||
with open(path, "r") as f:
|
with open(path, "r") as f:
|
||||||
try:
|
wpid = int(f.read() or 0)
|
||||||
pid = int(f.read())
|
|
||||||
except:
|
if wpid <= 0: return None
|
||||||
return None
|
|
||||||
if pid <= 0: return None
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
os.kill(pid, 0)
|
os.kill(wpid, 0)
|
||||||
return pid
|
return wpid
|
||||||
except OSError, e:
|
except OSError, e:
|
||||||
if e[0] == errno.ESRCH:
|
if e[0] == errno.ESRCH:
|
||||||
return
|
return
|
||||||
@ -144,8 +142,7 @@ class Arbiter(object):
|
|||||||
self.log.error("should be a non GUNICORN environnement")
|
self.log.error("should be a non GUNICORN environnement")
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
for i in range(5):
|
for i in range(5):
|
||||||
try:
|
try:
|
||||||
sock = self.init_socket(addr)
|
sock = self.init_socket(addr)
|
||||||
@ -224,6 +221,7 @@ class Arbiter(object):
|
|||||||
|
|
||||||
def handle_chld(self, sig, frame):
|
def handle_chld(self, sig, frame):
|
||||||
self.wakeup()
|
self.wakeup()
|
||||||
|
self.reap_workers()
|
||||||
|
|
||||||
def handle_hup(self):
|
def handle_hup(self):
|
||||||
self.log.info("Master hang up.")
|
self.log.info("Master hang up.")
|
||||||
@ -297,6 +295,7 @@ class Arbiter(object):
|
|||||||
self.reap_workers()
|
self.reap_workers()
|
||||||
self.kill_workers(signal.SIGKILL)
|
self.kill_workers(signal.SIGKILL)
|
||||||
|
|
||||||
|
|
||||||
def reexec(self):
|
def reexec(self):
|
||||||
self.reexec_pid = os.fork()
|
self.reexec_pid = os.fork()
|
||||||
if self.reexec_pid == 0:
|
if self.reexec_pid == 0:
|
||||||
@ -360,16 +359,14 @@ class Arbiter(object):
|
|||||||
self.log.exception("Exception in worker process.")
|
self.log.exception("Exception in worker process.")
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
finally:
|
finally:
|
||||||
worker.tmp.close()
|
|
||||||
self.log.info("Worker %s exiting." % worker_pid)
|
self.log.info("Worker %s exiting." % worker_pid)
|
||||||
os._exit(127)
|
|
||||||
|
|
||||||
def kill_workers(self, sig):
|
def kill_workers(self, sig):
|
||||||
for pid in self.WORKERS.keys():
|
for pid in self.WORKERS.keys():
|
||||||
self.kill_worker(pid, sig)
|
self.kill_worker(pid, sig)
|
||||||
|
|
||||||
def kill_worker(self, pid, sig):
|
def kill_worker(self, pid, sig):
|
||||||
|
self.log.info("ici")
|
||||||
try:
|
try:
|
||||||
os.kill(pid, sig)
|
os.kill(pid, sig)
|
||||||
except OSError, e:
|
except OSError, e:
|
||||||
|
|||||||
@ -56,7 +56,6 @@ def configure_logging(opts):
|
|||||||
for h in handlers:
|
for h in handlers:
|
||||||
h.setFormatter(logging.Formatter("%(levelname)s %(message)s"))
|
h.setFormatter(logging.Formatter("%(levelname)s %(message)s"))
|
||||||
logger.addHandler(h)
|
logger.addHandler(h)
|
||||||
return logger
|
|
||||||
|
|
||||||
def daemonize(logger):
|
def daemonize(logger):
|
||||||
if not 'GUNICORN_FD' in os.environ:
|
if not 'GUNICORN_FD' in os.environ:
|
||||||
@ -85,7 +84,7 @@ def daemonize(logger):
|
|||||||
def main(usage, get_app):
|
def main(usage, get_app):
|
||||||
parser = op.OptionParser(usage=usage, option_list=options())
|
parser = op.OptionParser(usage=usage, option_list=options())
|
||||||
opts, args = parser.parse_args()
|
opts, args = parser.parse_args()
|
||||||
logger = configure_logging(opts)
|
configure_logging(opts)
|
||||||
|
|
||||||
app = get_app(parser, opts, args)
|
app = get_app(parser, opts, args)
|
||||||
workers = opts.workers or 1
|
workers = opts.workers or 1
|
||||||
@ -110,12 +109,14 @@ def main(usage, get_app):
|
|||||||
arbiter = Arbiter((host,port), workers, app,
|
arbiter = Arbiter((host,port), workers, app,
|
||||||
**kwargs)
|
**kwargs)
|
||||||
if opts.daemon:
|
if opts.daemon:
|
||||||
daemonize(logger)
|
daemonize()
|
||||||
|
else:
|
||||||
|
os.setpgrp()
|
||||||
arbiter.run()
|
arbiter.run()
|
||||||
|
|
||||||
def paste_server(app, global_conf=None, host="127.0.0.1", port=None,
|
def paste_server(app, global_conf=None, host="127.0.0.1", port=None,
|
||||||
*args, **kwargs):
|
*args, **kwargs):
|
||||||
logger = configure_logging(opts)
|
configure_logging(opts)
|
||||||
if not port:
|
if not port:
|
||||||
if ':' in host:
|
if ':' in host:
|
||||||
host, port = host.split(':', 1)
|
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)
|
arbiter = Arbiter(bind_addr, workers, app, **kwargs)
|
||||||
if daemon == "true":
|
if daemon == "true":
|
||||||
daemonize(logger)
|
daemonize()
|
||||||
|
else:
|
||||||
|
os.setpgrp()
|
||||||
arbiter.run()
|
arbiter.run()
|
||||||
@ -22,7 +22,7 @@ class Worker(object):
|
|||||||
|
|
||||||
SIGNALS = map(
|
SIGNALS = map(
|
||||||
lambda x: getattr(signal, "SIG%s" % x),
|
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 = []
|
PIPE = []
|
||||||
@ -50,7 +50,6 @@ class Worker(object):
|
|||||||
|
|
||||||
# prevent inherientence
|
# prevent inherientence
|
||||||
util.close_on_exec(self.socket)
|
util.close_on_exec(self.socket)
|
||||||
self.socket.setblocking(0)
|
|
||||||
util.close_on_exec(fd)
|
util.close_on_exec(fd)
|
||||||
|
|
||||||
self.address = self.socket.getsockname()
|
self.address = self.socket.getsockname()
|
||||||
@ -62,18 +61,18 @@ class Worker(object):
|
|||||||
signal.signal(signal.SIGTERM, self.handle_exit)
|
signal.signal(signal.SIGTERM, self.handle_exit)
|
||||||
signal.signal(signal.SIGINT, self.handle_exit)
|
signal.signal(signal.SIGINT, self.handle_exit)
|
||||||
|
|
||||||
def handle_usr1(self, *args):
|
def handle_usr1(self, sig, frame):
|
||||||
self.nr = -65536;
|
self.nr = -65536;
|
||||||
try:
|
try:
|
||||||
map(lambda p: p.close(), self.PIPE)
|
map(lambda p: p.close(), self.PIPE)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def handle_quit(self, *args):
|
def handle_quit(self, sig, frame):
|
||||||
self.alive = False
|
self.alive = False
|
||||||
|
|
||||||
def handle_exit(self, sig, frame):
|
def handle_exit(self, sig, frame):
|
||||||
os._exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def _fchmod(self, mode):
|
def _fchmod(self, mode):
|
||||||
if getattr(os, 'fchmod', None):
|
if getattr(os, 'fchmod', None):
|
||||||
@ -112,7 +111,7 @@ class Worker(object):
|
|||||||
if self.nr == 0: break
|
if self.nr == 0: break
|
||||||
|
|
||||||
if self.ppid != os.getppid():
|
if self.ppid != os.getppid():
|
||||||
break
|
return
|
||||||
|
|
||||||
while self.alive:
|
while self.alive:
|
||||||
spinner = (spinner+1) % 2
|
spinner = (spinner+1) % 2
|
||||||
@ -120,16 +119,18 @@ class Worker(object):
|
|||||||
try:
|
try:
|
||||||
ret = select.select([self.socket], [], self.PIPE,
|
ret = select.select([self.socket], [], self.PIPE,
|
||||||
self.timeout)
|
self.timeout)
|
||||||
if ret[0]:
|
if ret[0]: break
|
||||||
break
|
|
||||||
except select.error, e:
|
except select.error, e:
|
||||||
if e[0] == errno.EINTR:
|
if e[0] == errno.EINTR:
|
||||||
break
|
break
|
||||||
|
if e[0] == errno.EBADF:
|
||||||
|
if nr >= 0:
|
||||||
|
return
|
||||||
raise
|
raise
|
||||||
|
|
||||||
spinner = (spinner+1) % 2
|
spinner = (spinner+1) % 2
|
||||||
self._fchmod(spinner)
|
self._fchmod(spinner)
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
def handle(self, client, addr):
|
def handle(self, client, addr):
|
||||||
util.close_on_exec(client)
|
util.close_on_exec(client)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user