training fixes
This commit is contained in:
156
scripts/kill_stale_processes.py
Normal file
156
scripts/kill_stale_processes.py
Normal file
@ -0,0 +1,156 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Kill Stale Processes Script
|
||||
|
||||
Safely terminates stale Python processes related to the trading dashboard
|
||||
with proper error handling and graceful termination.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import signal
|
||||
from pathlib import Path
|
||||
|
||||
def kill_stale_processes():
|
||||
"""Kill stale trading dashboard processes safely"""
|
||||
try:
|
||||
import psutil
|
||||
except ImportError:
|
||||
print("psutil not available - using fallback method")
|
||||
return kill_stale_fallback()
|
||||
|
||||
current_pid = os.getpid()
|
||||
killed_processes = []
|
||||
failed_processes = []
|
||||
|
||||
# Keywords to identify trading dashboard processes
|
||||
target_keywords = [
|
||||
'dashboard', 'scalping', 'trading', 'tensorboard',
|
||||
'run_clean', 'run_main', 'gogo2', 'mexc'
|
||||
]
|
||||
|
||||
try:
|
||||
print("Scanning for stale processes...")
|
||||
|
||||
# Get all Python processes
|
||||
python_processes = []
|
||||
for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
|
||||
try:
|
||||
if proc.info['pid'] == current_pid:
|
||||
continue
|
||||
|
||||
name = proc.info['name'].lower()
|
||||
if 'python' in name or 'tensorboard' in name:
|
||||
cmdline_str = ' '.join(proc.info['cmdline']) if proc.info['cmdline'] else ''
|
||||
|
||||
# Check if this is a target process
|
||||
if any(keyword in cmdline_str.lower() for keyword in target_keywords):
|
||||
python_processes.append({
|
||||
'proc': proc,
|
||||
'pid': proc.info['pid'],
|
||||
'name': proc.info['name'],
|
||||
'cmdline': cmdline_str
|
||||
})
|
||||
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
||||
continue
|
||||
|
||||
if not python_processes:
|
||||
print("No stale processes found")
|
||||
return True
|
||||
|
||||
print(f"Found {len(python_processes)} target processes to terminate:")
|
||||
for p in python_processes:
|
||||
print(f" - PID {p['pid']}: {p['name']} - {p['cmdline'][:80]}...")
|
||||
|
||||
# Graceful termination first
|
||||
print("\nAttempting graceful termination...")
|
||||
for p in python_processes:
|
||||
try:
|
||||
proc = p['proc']
|
||||
if proc.is_running():
|
||||
proc.terminate()
|
||||
print(f" Sent SIGTERM to PID {p['pid']}")
|
||||
except Exception as e:
|
||||
failed_processes.append(f"Failed to terminate PID {p['pid']}: {e}")
|
||||
|
||||
# Wait for graceful shutdown
|
||||
time.sleep(2.0)
|
||||
|
||||
# Force kill remaining processes
|
||||
print("\nChecking for remaining processes...")
|
||||
for p in python_processes:
|
||||
try:
|
||||
proc = p['proc']
|
||||
if proc.is_running():
|
||||
print(f" Force killing PID {p['pid']} ({p['name']})")
|
||||
proc.kill()
|
||||
killed_processes.append(f"Force killed PID {p['pid']} ({p['name']})")
|
||||
else:
|
||||
killed_processes.append(f"Gracefully terminated PID {p['pid']} ({p['name']})")
|
||||
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
||||
killed_processes.append(f"Process PID {p['pid']} already terminated")
|
||||
except Exception as e:
|
||||
failed_processes.append(f"Failed to kill PID {p['pid']}: {e}")
|
||||
|
||||
# Results
|
||||
print(f"\n=== Process Cleanup Results ===")
|
||||
if killed_processes:
|
||||
print(f"Successfully cleaned up {len(killed_processes)} processes:")
|
||||
for msg in killed_processes:
|
||||
print(f" ✓ {msg}")
|
||||
|
||||
if failed_processes:
|
||||
print(f"\nFailed to clean up {len(failed_processes)} processes:")
|
||||
for msg in failed_processes:
|
||||
print(f" ✗ {msg}")
|
||||
|
||||
print(f"\nCleanup completed. {len(killed_processes)} processes terminated.")
|
||||
return len(failed_processes) == 0
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error during process cleanup: {e}")
|
||||
return False
|
||||
|
||||
def kill_stale_fallback():
|
||||
"""Fallback method using basic OS commands"""
|
||||
print("Using fallback process killing method...")
|
||||
|
||||
try:
|
||||
if os.name == 'nt': # Windows
|
||||
import subprocess
|
||||
# Kill Python processes with dashboard keywords
|
||||
result = subprocess.run([
|
||||
'taskkill', '/f', '/im', 'python.exe'
|
||||
], capture_output=True, text=True)
|
||||
|
||||
if result.returncode == 0:
|
||||
print("Windows: Killed all Python processes")
|
||||
else:
|
||||
print("Windows: No Python processes to kill or access denied")
|
||||
|
||||
else: # Unix/Linux
|
||||
import subprocess
|
||||
# More targeted approach for Unix
|
||||
subprocess.run(['pkill', '-f', 'dashboard'], capture_output=True)
|
||||
subprocess.run(['pkill', '-f', 'scalping'], capture_output=True)
|
||||
subprocess.run(['pkill', '-f', 'tensorboard'], capture_output=True)
|
||||
print("Unix: Killed dashboard-related processes")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"Fallback method failed: {e}")
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("=" * 50)
|
||||
print("STALE PROCESS CLEANUP")
|
||||
print("=" * 50)
|
||||
|
||||
success = kill_stale_processes()
|
||||
exit_code = 0 if success else 1
|
||||
|
||||
print("=" * 50)
|
||||
sys.exit(exit_code)
|
Reference in New Issue
Block a user