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):
|
||||
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:
|
||||
|
||||
@ -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()
|
||||
@ -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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user