diff --git a/src/hypercorn/__main__.py b/src/hypercorn/__main__.py index aed33b12..28826800 100644 --- a/src/hypercorn/__main__.py +++ b/src/hypercorn/__main__.py @@ -215,6 +215,19 @@ def _convert_verify_mode(value: str) -> ssl.VerifyMode: default=sentinel, type=int, ) + daemon_group = parser.add_mutually_exclusive_group() + daemon_group.add_argument( + "--daemon", + action="store_true", + help="Spawn workers in daemon mode" + ) + daemon_group.add_argument( + "--no-daemon", + action="store_false", + dest="daemon", + help="Spawn workers in normal mode (without daemon)" + ) + parser.set_defaults(daemon=True) args = parser.parse_args(sys_args or sys.argv[1:]) config = _load_config(args.config) config.application_path = args.application @@ -301,6 +314,8 @@ def _convert_verify_mode(value: str) -> ssl.VerifyMode: if len(args.server_names) > 0: config.server_names = args.server_names + config.daemon = args.daemon + return run(config) diff --git a/src/hypercorn/config.py b/src/hypercorn/config.py index 71d5b2ef..ce56350f 100644 --- a/src/hypercorn/config.py +++ b/src/hypercorn/config.py @@ -60,6 +60,7 @@ class Config: _quic_addresses: List[Tuple] = [] _log: Optional[Logger] = None _root_path: str = "" + _daemon: bool = True access_log_format = '%(h)s %(l)s %(l)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"' accesslog: Union[logging.Logger, str, None] = None @@ -118,6 +119,14 @@ def set_cert_reqs(self, value: int) -> None: cert_reqs = property(None, set_cert_reqs) + @property + def daemon(self) -> bool: + return self._daemon + + @daemon.setter + def daemon(self, value: bool) -> None: + self._daemon = value + @property def log(self) -> Logger: if self._log is None: diff --git a/src/hypercorn/run.py b/src/hypercorn/run.py index cfe801aa..36b41b79 100644 --- a/src/hypercorn/run.py +++ b/src/hypercorn/run.py @@ -121,7 +121,7 @@ def _populate( target=worker_func, kwargs={"config": config, "shutdown_event": shutdown_event, "sockets": sockets}, ) - process.daemon = True + process.daemon = config.daemon try: process.start() except PicklingError as error: