From 08b58791015717502b9e9819b0560e619ea46453 Mon Sep 17 00:00:00 2001 From: Roland Tannous <115670425+rolandtannous@users.noreply.github.com> Date: Mon, 16 Mar 2026 11:58:09 +0400 Subject: [PATCH] fix: Ctrl+C not terminating backend on Linux (#4316) * fix: Ctrl+C not breaking out of backend on Linux threading.Event.wait() without a timeout blocks at the C level on Linux, preventing Python from delivering SIGINT. Use a 1-second timeout loop so the interpreter can process pending signals. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- cli/commands/studio.py | 5 ++++- studio/backend/run.py | 8 ++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cli/commands/studio.py b/cli/commands/studio.py index 0f1c021873..89b2227fa6 100644 --- a/cli/commands/studio.py +++ b/cli/commands/studio.py @@ -144,7 +144,10 @@ def studio_default( try: if _shutdown_event is not None: - _shutdown_event.wait() + # NOTE: Event.wait() without a timeout blocks at the C level + # on Linux, preventing Python from delivering SIGINT (Ctrl+C). + while not _shutdown_event.is_set(): + _shutdown_event.wait(timeout = 1) else: while True: time.sleep(1) diff --git a/studio/backend/run.py b/studio/backend/run.py index 3e2bdb5a9a..2f186758ae 100644 --- a/studio/backend/run.py +++ b/studio/backend/run.py @@ -270,5 +270,9 @@ if __name__ == "__main__": if hasattr(signal, "SIGBREAK"): signal.signal(signal.SIGBREAK, _signal_handler) - # Keep running until shutdown signal - _shutdown_event.wait() + # Keep running until shutdown signal. + # NOTE: Event.wait() without a timeout blocks at the C level on Linux, + # which prevents Python from delivering SIGINT (Ctrl+C). Using a + # short timeout in a loop lets the interpreter process pending signals. + while not _shutdown_event.is_set(): + _shutdown_event.wait(timeout = 1)