diff --git a/reflex/reflex.py b/reflex/reflex.py index c8a09c4a1..c81fa12ab 100644 --- a/reflex/reflex.py +++ b/reflex/reflex.py @@ -2,6 +2,7 @@ import os import platform +import signal import threading from pathlib import Path @@ -163,6 +164,9 @@ def run( args=(app.__name__, backend_host, backend_port, loglevel), ).start() + # Display custom message when there is a keyboard interrupt. + signal.signal(signal.SIGINT, processes.catch_keyboard_interrupt) + @cli.command() def deploy(dry_run: bool = typer.Option(False, help="Whether to run a dry run.")): diff --git a/reflex/utils/processes.py b/reflex/utils/processes.py index 7b494b3be..6b3b3e250 100644 --- a/reflex/utils/processes.py +++ b/reflex/utils/processes.py @@ -7,6 +7,7 @@ import os import signal import subprocess import sys +from datetime import datetime from typing import Optional from urllib.parse import urlparse @@ -145,3 +146,14 @@ def new_process(args, **kwargs): args, **kwargs, ) + + +def catch_keyboard_interrupt(signal, frame): + """Display a custom message with the current time when exiting an app. + + Args: + signal: The keyboard interrupt signal. + frame: The current stack frame. + """ + current_time = datetime.now().isoformat() + console.print(f"\nReflex app stopped at time: {current_time}")