class_docstr: Explicitly coordinate the level Tornado components required to run a
  Bokeh server:
  
  * A Tornado ``IOLoop`` to run the Bokeh server machinery.
  
  * a ``BokehTornado`` Tornado application that defines the Bokeh server
    machinery.
  
  * a Tornado ``HTTPServer`` to direct HTTP requests
  
  All three of these components must be passed to ``BaseServer``, which will
  initialize the ``BokehTornado`` instance on the ``io_loop``. The
  ``http_server`` must have been previously created and initialized with the
  ``BokehTornado`` instance.
docstr: Run the Bokeh Server until shutdown is requested by the user,
  either via a Keyboard interrupt (Ctrl-C) or SIGTERM.
  
  Calling this method will start the Tornado ``IOLoop`` and block
  all execution in the calling process.
  
  Returns:
      None
docstr_tok: ["Run","the","Bokeh","Server","until","shutdown","is","requested","by","the","user",",","either","via","a","Keyboard","interrupt","(","Ctrl-C",")","or","SIGTERM",".","Calling","this","method","will","start","the","Tornado","``","IOLoop","``","and","block","all","execution","in","the","calling","process",".","Returns",":","None"]
code: def run_until_shutdown(self) -> None:
      """Run the Bokeh Server until shutdown is requested by the user,
      either via a Keyboard interrupt (Ctrl-C) or SIGTERM.
  
      Calling this method will start the Tornado ``IOLoop`` and block
      all execution in the calling process.
  
      Returns:
          None
  
      """
      if not self._started:
          self.start()
      # Install shutdown hooks
      atexit.register(self._atexit)
      signal.signal(signal.SIGTERM, self._sigterm)
      try:
          self._loop.start()
      except KeyboardInterrupt:
          print("\nInterrupted, shutting down")
      self.stop()
  
imports: from __future__ import annotations
  import logging
  import atexit
  import signal
  import socket
  import sys
  from types import FrameType
  from typing import TYPE_CHECKING, Any, Mapping
  from tornado import netutil, version
  from tornado.httpserver import HTTPServer
  from tornado.ioloop import IOLoop
  from ..None import __version__
  from ..core import properties
  from ..core.properties import Bool, Int, Nullable, String
  from ..resources import DEFAULT_SERVER_PORT, server_url
  from ..util.options import Options
  from .tornado import DEFAULT_WEBSOCKET_MAX_MESSAGE_SIZE_BYTES, BokehTornado
  from .util import bind_sockets, create_hosts_allowlist
label_desc: Use image node_id 6 for calling the BaseServer obj's underlying member method code with example usage: obj.run_until_shutdown() without return types