add console process interruption by ctrl C

This commit is contained in:
IgorKurkov
2025-10-26 21:28:58 +01:00
parent 902368efa7
commit d8fbf967b3
2 changed files with 30 additions and 2 deletions

20
cps.py
View File

@@ -42,9 +42,25 @@ def hide_console_windows():
if __name__ == '__main__': if __name__ == '__main__':
if os.name == "nt": # Only hide the console window on Windows when there is no interactive
# console attached. This preserves the ability to use Ctrl+C from a
# terminal (stdin is a tty) to stop the server.
if os.name == "nt" and not sys.stdin.isatty():
hide_console_windows() hide_console_windows()
main()
try:
main()
except KeyboardInterrupt:
# Allow stopping the server with Ctrl+C from an interactive console.
try:
# Try to perform a graceful stop if web_server is available.
# Import here to avoid import-time side-effects when not needed.
from cps import web_server
web_server.stop()
except Exception:
pass
print('\nCalibre-Web: received interrupt, shutting down')
sys.exit(0)

View File

@@ -216,6 +216,12 @@ class WebServer(object):
try: try:
sock, output = self._make_gevent_listener() sock, output = self._make_gevent_listener()
log.info('Starting Gevent server on %s', output) log.info('Starting Gevent server on %s', output)
# Also print to stdout so interactive terminals show a clear success message
try:
print(f"Calibre-Web: server started on {output}")
except Exception:
print(f"Calibre-Web: error {output}")
pass
self.wsgiserver = WSGIServer(sock, self.app, log=self.access_logger, handler_class=MyWSGIHandler, self.wsgiserver = WSGIServer(sock, self.app, log=self.access_logger, handler_class=MyWSGIHandler,
error_log=log, error_log=log,
spawn=Pool(), **ssl_args) spawn=Pool(), **ssl_args)
@@ -266,6 +272,12 @@ class WebServer(object):
output = _readable_listen_address(self.listen_address, self.listen_port) output = _readable_listen_address(self.listen_address, self.listen_port)
http_server.listen(self.listen_port, self.listen_address) http_server.listen(self.listen_port, self.listen_address)
log.info('Starting Tornado server on %s', output) log.info('Starting Tornado server on %s', output)
# Also print to stdout so interactive terminals show a clear success message
try:
print(f"Calibre-Web: server started on {output}")
except Exception:
print(f"Calibre-Web: error {output}")
pass
self.wsgiserver = IOLoop.current() self.wsgiserver = IOLoop.current()
self.wsgiserver.start() self.wsgiserver.start()