| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- #!/usr/bin/env bash
- # Kill zombie Chrome/Chromium processes listening on 127.0.0.1
- # Works cross-platform on macOS and Linux
- #
- # Usage:
- # ./bin/kill_chrome.sh # Kill Chrome processes with verification
- # ./bin/kill_chrome.sh --pkill # Quick kill using pkill (less precise)
- # ./bin/kill_chrome.sh --help # Show this help
- set -e
- # Detect OS
- OS="$(uname -s)"
- # Chrome binary patterns to search for (cross-platform)
- CHROME_PATTERNS=(
- "Google Chrome"
- "google-chrome"
- "chrome"
- "chromium"
- "chromium-browser"
- "Chromium"
- )
- # Function to kill Chrome processes
- kill_chrome_processes() {
- echo "Searching for Chrome processes listening on 127.0.0.1..."
- local killed=0
- for pattern in "${CHROME_PATTERNS[@]}"; do
- # Find processes matching the pattern with remote debugging
- if [ "$OS" = "Darwin" ]; then
- # macOS
- pids=$(ps aux | grep -i "$pattern" | grep -E "(remote-debugging-port|remote-debugging-address=127\.0\.0\.1)" | grep -v grep | awk '{print $2}' || true)
- else
- # Linux
- pids=$(ps aux | grep -i "$pattern" | grep -E "(remote-debugging-port|remote-debugging-address=127\.0\.0\.1)" | grep -v grep | awk '{print $2}' || true)
- fi
- if [ -n "$pids" ]; then
- echo "Found Chrome processes ($pattern): $pids"
- for pid in $pids; do
- # Try regular kill first
- if kill "$pid" 2>/dev/null; then
- echo " Killed $pid"
- killed=$((killed + 1))
- sleep 0.1
- fi
- # Check if still alive
- if ps -p "$pid" > /dev/null 2>&1; then
- # Check process state first to avoid attempting impossible kills
- if [ "$OS" = "Darwin" ]; then
- state=$(ps -o state -p "$pid" 2>/dev/null | tail -1 | tr -d ' ')
- else
- state=$(ps -o stat -p "$pid" 2>/dev/null | tail -1 | tr -d ' ')
- fi
- # Check if it's a zombie/uninterruptible process BEFORE trying to kill
- if [[ "$state" == *"Z"* ]] || [[ "$state" == *"D"* ]] || [[ "$state" == *"UNE"* ]]; then
- echo " WARNING: $pid is in uninterruptible/zombie state ($state) - cannot be killed"
- echo " Process will clean up automatically or requires system reboot"
- else
- # Try force kill
- echo " Force killing $pid with -9..."
- if kill -9 "$pid" 2>/dev/null; then
- # Wait briefly and verify
- sleep 0.2
- if ! ps -p "$pid" > /dev/null 2>&1; then
- echo " Force killed $pid"
- killed=$((killed + 1))
- else
- echo " WARNING: $pid survived kill -9 (state: $state)"
- fi
- else
- echo " ERROR: Failed to kill $pid (state: $state)"
- fi
- fi
- fi
- done
- fi
- done
- if [ $killed -eq 0 ]; then
- echo "No Chrome processes listening on 127.0.0.1 found (or all are zombie/uninterruptible)"
- else
- echo "Successfully killed $killed Chrome process(es)"
- fi
- # Show remaining Chrome processes (if any)
- echo ""
- echo "Remaining Chrome processes listening on 127.0.0.1:"
- for pattern in "${CHROME_PATTERNS[@]}"; do
- ps aux | grep -i "$pattern" | grep -E "(remote-debugging-port|remote-debugging-address=127\.0\.0\.1)" | grep -v grep || true
- done | head -10
- if [ $(ps aux | grep -iE "(google chrome|chrome|chromium)" | grep -E "(remote-debugging-port|remote-debugging-address=127\.0\.0\.1)" | grep -v grep | wc -l) -eq 0 ]; then
- echo " (none)"
- fi
- }
- # Alternative approach using pkill (faster but less precise)
- kill_chrome_pkill() {
- echo "Using pkill to kill all Chrome processes..."
- for pattern in "${CHROME_PATTERNS[@]}"; do
- if pkill -9 -f "$pattern" 2>/dev/null; then
- echo " Killed processes matching: $pattern"
- fi
- done
- sleep 0.5
- echo "Done"
- }
- # Show help
- show_help() {
- cat << EOF
- Kill zombie Chrome/Chromium processes listening on 127.0.0.1
- Usage:
- $0 [OPTIONS]
- Options:
- (none) Kill Chrome processes with state verification (recommended)
- --pkill, -p Quick kill using pkill (faster but less precise)
- --help, -h Show this help message
- Description:
- This script finds and kills Chrome/Chromium processes that are listening
- on 127.0.0.1 (with --remote-debugging-port or --remote-debugging-address).
- Supports multiple Chrome binary names:
- - Google Chrome / chrome / google-chrome
- - Chromium / chromium / chromium-browser
- Works on macOS and Linux.
- Zombie/uninterruptible processes (state UNE/Z/D) will be detected and
- reported but cannot be killed. They will clean up automatically.
- Examples:
- $0 # Kill with verification
- $0 --pkill # Quick kill all Chrome processes
- EOF
- }
- # Parse arguments
- if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
- show_help
- elif [ "$1" = "--pkill" ] || [ "$1" = "-p" ]; then
- kill_chrome_pkill
- else
- kill_chrome_processes
- fi
|