#!/bin/bash # # Process Terminator Script for macOS # This script forcibly terminates a process and all its descendant processes # # Check if PID argument is provided if [ $# -ne 1 ]; then echo "Usage: $0 " exit 1 fi PID=$1 # Validate that input is a valid PID (numeric) if ! [[ "$PID" =~ ^[0-9]+$ ]]; then echo "Error: The PID must be a numeric value" exit 1 fi # Check if the process exists - using kill -0 which is more reliable on macOS if ! kill -0 $PID 2>/dev/null; then echo "Warning: No process found with PID $PID" exit 0 fi # Recursive function to find and kill all descendant processes kill_descendants() { local parent=$1 # Use ps -axo for macOS to ensure all processes are included local children=$(ps -axo pid=,ppid= | awk -v ppid=$parent '$2==ppid {print $1}') echo "Processing children of PID: $parent..." for child in $children; do kill_descendants "$child" echo "Terminating child process: $child" kill -9 "$child" 2>/dev/null || true done } echo "============================================" echo "Starting termination of process $PID and all its descendants" echo "============================================" # Try graceful termination first echo "Attempting graceful termination (SIGTERM) of PID: $PID" kill -15 "$PID" 2>/dev/null || true sleep 1 # If still running, fall back to kill_descendants # Use the macOS-native 'kill -0' check if kill -0 $PID 2>/dev/null; then echo "Process $PID did not exit after SIGTERM; proceeding with forced termination of its descendants and itself" else echo "Process $PID exited cleanly after SIGTERM" exit 0 fi # Find and kill all descendant processes kill_descendants "$PID" # Finally kill the main process echo "Terminating main process: $PID" kill -9 "$PID" 2>/dev/null || true # Wait a little for process/port resources to be fully released FINAL_WAIT_SECONDS=1 echo "Waiting ${FINAL_WAIT_SECONDS}s for resources to settle..." sleep "$FINAL_WAIT_SECONDS" echo "============================================" echo "Process $PID and all its descendants have been terminated" echo "============================================" exit 0