mirror of
https://github.com/2dust/v2rayN.git
synced 2026-09-28 09:48:02 +03:00
https://github.com/2dust/v2rayN/issues/9863 Add a short 1-second delay after terminating core processes on Linux, macOS, and in CoreAdminManager so ports and process resources have time to settle before the next step runs.
76 lines
2.1 KiB
Bash
76 lines
2.1 KiB
Bash
#!/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 <PID>"
|
|
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
|