#!/usr/bin/env python3 """ Script to start Celery components for the Lin application. This script provides a unified way to start Celery worker and beat scheduler. """ import os import sys import subprocess import platform from pathlib import Path # Add the backend directory to Python path backend_dir = Path(__file__).parent sys.path.insert(0, str(backend_dir)) def check_redis(): """Check if Redis is running.""" try: import redis client = redis.Redis(host='localhost', port=6379, db=0) client.ping() print("✓ Redis connection successful") return True except Exception as e: print(f"✗ Redis connection failed: {e}") print("Please start Redis server first:") print(" Windows: redis-server") print(" Linux/Mac: sudo systemctl start redis") return False def start_worker(): """Start Celery worker.""" print("Starting Celery worker...") # Add project root to PYTHONPATH project_root = backend_dir.parent.resolve() env = os.environ.copy() current_pythonpath = env.get('PYTHONPATH', '') env['PYTHONPATH'] = str(project_root) + os.pathsep + current_pythonpath if current_pythonpath else str(project_root) cmd = [ sys.executable, "-m", "celery", "-A", "celery_config:celery_app", "worker", "--loglevel=info", "--pool=solo", "--max-tasks-per-child=100", "--events" # Enable task events for monitoring ] if platform.system() == "Windows": subprocess.Popen(cmd, cwd=backend_dir, env=env) else: subprocess.Popen(cmd, cwd=backend_dir, env=env) print("Celery worker started") def start_beat(): """Start Celery Beat scheduler.""" print("Starting Celery Beat scheduler...") # Add project root to PYTHONPATH project_root = backend_dir.parent.resolve() env = os.environ.copy() current_pythonpath = env.get('PYTHONPATH', '') env['PYTHONPATH'] = str(project_root) + os.pathsep + current_pythonpath if current_pythonpath else str(project_root) cmd = [ sys.executable, "-m", "celery", "-A", "celery_config:celery_app", "beat", "--loglevel=info", "--schedule=/tmp/celerybeat-schedule" # Specify writable location for schedule file ] if platform.system() == "Windows": subprocess.Popen(cmd, cwd=backend_dir, env=env) else: subprocess.Popen(cmd, cwd=backend_dir, env=env) print("Celery Beat scheduler started") def start_all(): """Start both worker and beat.""" if not check_redis(): return False print("Starting all Celery components...") start_worker() start_beat() print("All Celery components started") return True def main(): """Main function.""" if len(sys.argv) < 2: print("Usage: python start_celery.py ") print("Commands:") print(" worker - Start Celery worker only") print(" beat - Start Celery Beat scheduler only") print(" all - Start both worker and beat") print(" check - Check system requirements") sys.exit(1) command = sys.argv[1].lower() if command == "worker": if not check_redis(): sys.exit(1) start_worker() elif command == "beat": if not check_redis(): sys.exit(1) start_beat() elif command == "all": if not start_all(): sys.exit(1) elif command == "check": print("Checking system requirements...") if check_redis(): print("✓ All requirements met") else: print("✗ Some requirements not met") sys.exit(1) else: print(f"Unknown command: {command}") sys.exit(1) if __name__ == "__main__": main()