data stream working
This commit is contained in:
@@ -60,6 +60,118 @@ def check_system_resources():
|
||||
return False
|
||||
return True
|
||||
|
||||
def kill_existing_dashboard_processes():
|
||||
"""Kill any existing dashboard processes and free port 8050"""
|
||||
import subprocess
|
||||
import signal
|
||||
|
||||
try:
|
||||
# Find processes using port 8050
|
||||
logger.info("Checking for processes using port 8050...")
|
||||
|
||||
# Method 1: Use lsof to find processes using port 8050
|
||||
try:
|
||||
result = subprocess.run(['lsof', '-ti', ':8050'],
|
||||
capture_output=True, text=True, timeout=10)
|
||||
if result.returncode == 0 and result.stdout.strip():
|
||||
pids = result.stdout.strip().split('\n')
|
||||
logger.info(f"Found processes using port 8050: {pids}")
|
||||
|
||||
for pid in pids:
|
||||
if pid.strip():
|
||||
try:
|
||||
logger.info(f"Killing process {pid}")
|
||||
os.kill(int(pid), signal.SIGTERM)
|
||||
time.sleep(1)
|
||||
# Force kill if still running
|
||||
os.kill(int(pid), signal.SIGKILL)
|
||||
except (ProcessLookupError, ValueError) as e:
|
||||
logger.debug(f"Process {pid} already terminated: {e}")
|
||||
except Exception as e:
|
||||
logger.warning(f"Error killing process {pid}: {e}")
|
||||
except (subprocess.TimeoutExpired, FileNotFoundError):
|
||||
logger.debug("lsof not available or timed out")
|
||||
|
||||
# Method 2: Use ps and grep to find Python processes
|
||||
try:
|
||||
result = subprocess.run(['ps', 'aux'],
|
||||
capture_output=True, text=True, timeout=10)
|
||||
if result.returncode == 0:
|
||||
lines = result.stdout.split('\n')
|
||||
for line in lines:
|
||||
if 'run_clean_dashboard' in line or 'clean_dashboard' in line:
|
||||
parts = line.split()
|
||||
if len(parts) > 1:
|
||||
pid = parts[1]
|
||||
try:
|
||||
logger.info(f"Killing dashboard process {pid}")
|
||||
os.kill(int(pid), signal.SIGTERM)
|
||||
time.sleep(1)
|
||||
os.kill(int(pid), signal.SIGKILL)
|
||||
except (ProcessLookupError, ValueError) as e:
|
||||
logger.debug(f"Process {pid} already terminated: {e}")
|
||||
except Exception as e:
|
||||
logger.warning(f"Error killing process {pid}: {e}")
|
||||
except (subprocess.TimeoutExpired, FileNotFoundError):
|
||||
logger.debug("ps not available or timed out")
|
||||
|
||||
# Method 3: Use netstat to find processes using port 8050
|
||||
try:
|
||||
result = subprocess.run(['netstat', '-tlnp'],
|
||||
capture_output=True, text=True, timeout=10)
|
||||
if result.returncode == 0:
|
||||
lines = result.stdout.split('\n')
|
||||
for line in lines:
|
||||
if ':8050' in line and 'LISTEN' in line:
|
||||
parts = line.split()
|
||||
if len(parts) > 6:
|
||||
pid_part = parts[6]
|
||||
if '/' in pid_part:
|
||||
pid = pid_part.split('/')[0]
|
||||
try:
|
||||
logger.info(f"Killing process {pid} using port 8050")
|
||||
os.kill(int(pid), signal.SIGTERM)
|
||||
time.sleep(1)
|
||||
os.kill(int(pid), signal.SIGKILL)
|
||||
except (ProcessLookupError, ValueError) as e:
|
||||
logger.debug(f"Process {pid} already terminated: {e}")
|
||||
except Exception as e:
|
||||
logger.warning(f"Error killing process {pid}: {e}")
|
||||
except (subprocess.TimeoutExpired, FileNotFoundError):
|
||||
logger.debug("netstat not available or timed out")
|
||||
|
||||
# Wait a bit for processes to fully terminate
|
||||
time.sleep(2)
|
||||
|
||||
# Verify port is free
|
||||
try:
|
||||
result = subprocess.run(['lsof', '-ti', ':8050'],
|
||||
capture_output=True, text=True, timeout=5)
|
||||
if result.returncode == 0 and result.stdout.strip():
|
||||
logger.warning("Port 8050 still in use after cleanup")
|
||||
return False
|
||||
else:
|
||||
logger.info("Port 8050 is now free")
|
||||
return True
|
||||
except (subprocess.TimeoutExpired, FileNotFoundError):
|
||||
logger.info("Port 8050 cleanup verification skipped")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error during process cleanup: {e}")
|
||||
return False
|
||||
|
||||
def check_port_availability(port=8050):
|
||||
"""Check if a port is available"""
|
||||
import socket
|
||||
|
||||
try:
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
||||
s.bind(('127.0.0.1', port))
|
||||
return True
|
||||
except OSError:
|
||||
return False
|
||||
|
||||
def run_dashboard_with_recovery():
|
||||
"""Run dashboard with automatic error recovery"""
|
||||
max_retries = 3
|
||||
@@ -69,6 +181,14 @@ def run_dashboard_with_recovery():
|
||||
try:
|
||||
logger.info(f"Starting Clean Trading Dashboard (attempt {retry_count + 1}/{max_retries})")
|
||||
|
||||
# Clean up existing processes and free port 8050
|
||||
if not check_port_availability(8050):
|
||||
logger.info("Port 8050 is in use, cleaning up existing processes...")
|
||||
if not kill_existing_dashboard_processes():
|
||||
logger.warning("Failed to free port 8050, waiting 10 seconds...")
|
||||
time.sleep(10)
|
||||
continue
|
||||
|
||||
# Check system resources
|
||||
if not check_system_resources():
|
||||
logger.warning("System resources low, waiting 30 seconds...")
|
||||
|
||||
Reference in New Issue
Block a user