Finalized port closing and error warning. (#391)

This commit is contained in:
Alek Petuskey 2023-01-29 20:33:32 -08:00 committed by GitHub
parent 4971f6d814
commit 450576bbee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 66 additions and 10 deletions

View File

@ -8,6 +8,8 @@ import typer
from pynecone import constants, utils from pynecone import constants, utils
from rich.prompt import Prompt
# Create the app. # Create the app.
cli = typer.Typer() cli = typer.Typer()
@ -60,6 +62,16 @@ def run(
port: str = typer.Option(None, help="Specify a different port."), port: str = typer.Option(None, help="Specify a different port."),
): ):
"""Run the app in the current directory.""" """Run the app in the current directory."""
frontend_port = utils.get_config().port if port is None else port
backend_port = utils.get_api_port()
# If something is running on the ports, ask the user if they want to kill it.
if utils.is_process_on_port(frontend_port):
utils.terminate_port(frontend_port, "frontend")
if utils.is_process_on_port(backend_port):
utils.terminate_port(backend_port, "backend")
# Check that the app is initialized. # Check that the app is initialized.
if frontend and not utils.is_initialized(): if frontend and not utils.is_initialized():
utils.console.print( utils.console.print(
@ -93,8 +105,8 @@ def run(
if backend: if backend:
backend_cmd(app.__name__, loglevel=loglevel) backend_cmd(app.__name__, loglevel=loglevel)
finally: finally:
utils.kill_process_on_port(os.environ["PORT"]) utils.kill_process_on_port(frontend_port)
utils.kill_process_on_port(utils.get_api_port()) utils.kill_process_on_port(backend_port)
@cli.command() @cli.command()

View File

@ -37,6 +37,7 @@ import uvicorn
from plotly.io import to_json from plotly.io import to_json
from redis import Redis from redis import Redis
from rich.console import Console from rich.console import Console
from rich.prompt import Prompt
from pynecone import constants from pynecone import constants
from pynecone.base import Base from pynecone.base import Base
@ -582,20 +583,63 @@ def get_api_port() -> int:
return port return port
def get_process_on_port(port) -> Optional[psutil.Process]:
"""Get the process on the given port.
Args:
port: The port.
Returns:
The process on the given port.
"""
for proc in psutil.process_iter(["pid", "name", "cmdline"]):
try:
for conns in proc.connections(kind="inet"):
if conns.laddr.port == int(port):
return proc
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass
return None
def is_process_on_port(port) -> bool:
"""Check if a process is running on the given port.
Args:
port: The port.
Returns:
Whether a process is running on the given port.
"""
return get_process_on_port(port) is not None
def kill_process_on_port(port): def kill_process_on_port(port):
"""Kill the process on the given port. """Kill the process on the given port.
Args: Args:
port: The port. port: The port.
""" """
for proc in psutil.process_iter(["pid", "name", "cmdline"]): if get_process_on_port(port) is not None:
try: get_process_on_port(port).kill() # type: ignore
for conns in proc.connections(kind="inet"):
if conns.laddr.port == port:
proc.kill() def terminate_port(port, _type):
return """Terminate the port.
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass Args:
port: The port.
_type: The type of the port.
"""
console.print(
f"Something is already running on port [bold underline]{port}[/bold underline]. This is the port the {_type} runs on."
)
frontend_action = Prompt.ask("Kill it?", choices=["y", "n"])
if frontend_action == "y":
kill_process_on_port(port)
else:
console.print("Exiting...")
sys.exit()
def run_backend(app_name: str, loglevel: constants.LogLevel = constants.LogLevel.ERROR): def run_backend(app_name: str, loglevel: constants.LogLevel = constants.LogLevel.ERROR):