import os
import psutil
import signal

def kill_process_tree():
    pid = os.getpid()  # Get the current process ID
    try:
        # Send SIGTERM to the entire process group to ensure all processes are targeted
        os.killpg(os.getpgid(pid), signal.SIGKILL)
        parent = psutil.Process(pid)
        children = parent.children(recursive=True)
        for child in children:
            print(f"Forcefully terminating child PID {child.pid}")
            child.kill()  # Forcefully kill the child process immediately
        gone, still_alive = psutil.wait_procs(children, timeout=3)
        
        if still_alive:
            for child in still_alive:
                print(f"Child PID {child.pid} still alive, attempting another kill")
                child.kill()
        
        print(f"Forcefully terminating parent PID {pid}")
        parent.kill()  # Forcefully kill the parent process immediately
        parent.wait(3)  # Wait for the parent process to terminate
    except psutil.NoSuchProcess:
        print(f"Process {pid} does not exist or is already terminated")
    except psutil.AccessDenied:
        print(f"Permission denied to terminate some processes")
