| 501 | os.execvpe(self.START_CTX[0], self.START_CTX['args'], environ) |
| 502 | |
| 503 | def reload(self): |
| 504 | # Track reload stats |
| 505 | self._stats['reloads'] += 1 |
| 506 | |
| 507 | old_address = self.cfg.address |
| 508 | |
| 509 | # reset old environment |
| 510 | for k in self.cfg.env: |
| 511 | if k in self.cfg.env_orig: |
| 512 | # reset the key to the value it had before |
| 513 | # we launched gunicorn |
| 514 | os.environ[k] = self.cfg.env_orig[k] |
| 515 | else: |
| 516 | # delete the value set by gunicorn |
| 517 | try: |
| 518 | del os.environ[k] |
| 519 | except KeyError: |
| 520 | pass |
| 521 | |
| 522 | # reload conf |
| 523 | self.app.reload() |
| 524 | self.setup(self.app) |
| 525 | |
| 526 | # reopen log files |
| 527 | self.log.reopen_files() |
| 528 | |
| 529 | # do we need to change listener ? |
| 530 | if old_address != self.cfg.address: |
| 531 | # close all listeners |
| 532 | for lnr in self.LISTENERS: |
| 533 | lnr.close() |
| 534 | # init new listeners |
| 535 | self.LISTENERS = sock.create_sockets(self.cfg, self.log) |
| 536 | listeners_str = ",".join([str(lnr) for lnr in self.LISTENERS]) |
| 537 | self.log.info("Listening at: %s", listeners_str) |
| 538 | |
| 539 | # do some actions on reload |
| 540 | self.cfg.on_reload(self) |
| 541 | |
| 542 | # unlink pidfile |
| 543 | if self.pidfile is not None: |
| 544 | self.pidfile.unlink() |
| 545 | |
| 546 | # create new pidfile |
| 547 | if self.cfg.pidfile is not None: |
| 548 | self.pidfile = Pidfile(self.cfg.pidfile) |
| 549 | self.pidfile.create(self.pid) |
| 550 | |
| 551 | # set new proc_name |
| 552 | util._setproctitle("master [%s]" % self.proc_name) |
| 553 | |
| 554 | # Remember current worker age before spawning new workers |
| 555 | last_worker_age = self.worker_age |
| 556 | |
| 557 | # spawn new workers |
| 558 | for _ in range(self.cfg.workers): |
| 559 | self.spawn_worker() |
| 560 | |