Finalized port closing and error warning. (#391)
This commit is contained in:
parent
4971f6d814
commit
450576bbee
@ -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()
|
||||||
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user