Created
August 9, 2025 02:58
-
-
Save koad/9295c94e77e75223268efcf654ea7369 to your computer and use it in GitHub Desktop.
A bash script that will destroy all your open tabs, they remain in place so you can refresh them when needed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# ANSI color codes | |
GREEN='\033[0;32m' | |
CYAN='\033[0;36m' | |
YELLOW='\033[1;33m' | |
RED='\033[0;31m' | |
BLUE='\033[0;34m' | |
PURPLE='\033[0;35m' | |
NC='\033[0m' # No Color | |
# Initialize counters | |
total_tabs_killed=0 | |
total_memory_freed=0 | |
# ASCII Art Banner | |
display_banner() { | |
cat << "EOF" | |
╔══════════════════════════════════════════════════════════════════════════╗ | |
║ ║ | |
║ ████████╗ █████╗ ██████╗ ██╗ ██╗██╗██╗ ██╗ ███████╗██████╗ ║ | |
║ ╚══██╔══╝██╔══██╗██╔══██╗ ██║ ██╔╝██║██║ ██║ ██╔════╝██╔══██╗║ | |
║ ██║ ███████║██████╔╝ █████╔╝ ██║██║ ██║ █████╗ ██████╔╝║ | |
║ ██║ ██╔══██║██╔══██╗ ██╔═██╗ ██║██║ ██║ ██╔══╝ ██╔══██╗║ | |
║ ██║ ██║ ██║██████╔╝ ██║ ██╗██║███████╗███████╗███████╗██║ ██║║ | |
║ ╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝║ | |
║ ║ | |
║ [v1.0] ©2025 SYSTEM OPTIMIZER ║ | |
╚══════════════════════════════════════════════════════════════════════════╝ | |
EOF | |
} | |
# Function to display box with text | |
display_box() { | |
local text=$1 | |
local width=74 | |
local padding=$(( (width - ${#text}) / 2 )) | |
echo "╔══════════════════════════════════════════════════════════════════════════╗" | |
printf "║%${padding}s%s%$((width - padding - ${#text}))s║\n" "" "$text" "" | |
echo "╚══════════════════════════════════════════════════════════════════════════╝" | |
} | |
# Display loading animation | |
display_loading() { | |
local text=$1 | |
echo -n -e "${CYAN}$text ${NC}" | |
for i in {1..5}; do | |
echo -n "." | |
sleep 0.1 | |
done | |
echo "" | |
} | |
# Function to convert memory units to MB | |
convert_to_mb() { | |
local mem=$1 | |
local unit=${2:-KB} | |
case $unit in | |
B) echo "scale=2; $mem / 1048576" | bc ;; | |
KB) echo "scale=2; $mem / 1024" | bc ;; | |
MB) echo $mem ;; | |
GB) echo "scale=2; $mem * 1024" | bc ;; | |
*) echo $mem ;; | |
esac | |
} | |
# Function to kill tabs for a specified browser | |
kill_browser_tabs() { | |
local browser_name=$1 | |
local process_name=$2 | |
local browser_tabs_killed=0 | |
local browser_memory_freed=0 | |
echo -e "${YELLOW}┌──────────────────────────────────────────────────────────────────────────┐${NC}" | |
echo -e "${YELLOW}│${NC} ${CYAN}SCANNING${NC}: Looking for ${GREEN}${browser_name}${NC} tabs... ${YELLOW}│${NC}" | |
echo -e "${YELLOW}└──────────────────────────────────────────────────────────────────────────┘${NC}" | |
display_loading "INITIALIZING SCAN" | |
# Get processes, extract URL or title info if possible, then kill | |
pgrep -f -a "${process_name}" | grep 'type=renderer' | grep -v "extension" | while read pid cmd; do | |
# Get memory usage before killing | |
local mem_info=$(ps -o rss= -p $pid 2>/dev/null) | |
if [ -n "$mem_info" ]; then | |
# Convert KB to MB and add to total | |
local mem_mb=$(convert_to_mb $mem_info) | |
browser_memory_freed=$(echo "scale=2; $browser_memory_freed + $mem_mb" | bc) | |
total_memory_freed=$(echo "scale=2; $total_memory_freed + $mem_mb" | bc) | |
fi | |
# Extract a meaningful name for the tab if possible | |
tab_info=$(echo "$cmd" | grep -o -E 'https?://[^ ]+|--app=[^ ]+' | head -1) | |
if [ -z "$tab_info" ]; then | |
tab_info="[UNKNOWN]" | |
fi | |
echo -e "${RED}■ TERMINATING${NC} ${browser_name} [PID:$pid] ${BLUE}${tab_info}${NC} ${YELLOW}(${mem_mb:-0} MB)${NC}" | |
kill $pid | |
browser_tabs_killed=$((browser_tabs_killed + 1)) | |
total_tabs_killed=$((total_tabs_killed + 1)) | |
sleep 0.05 # Slow down for visual effect | |
done | |
if [ $browser_tabs_killed -gt 0 ]; then | |
echo -e "${YELLOW}┌──────────────────────────────────────────────────────────────────────────┐${NC}" | |
echo -e "${YELLOW}│${NC} ${GREEN}COMPLETE${NC}: ${browser_name} - Terminated $browser_tabs_killed processes / Freed ${browser_memory_freed} MB ${YELLOW}│${NC}" | |
echo -e "${YELLOW}└──────────────────────────────────────────────────────────────────────────┘${NC}" | |
echo "" | |
else | |
echo -e "${BLUE}>> No ${browser_name} tabs found <<${NC}" | |
echo "" | |
fi | |
} | |
# Function for Firefox, which has a different process model | |
kill_firefox_tabs() { | |
echo -e "${YELLOW}┌──────────────────────────────────────────────────────────────────────────┐${NC}" | |
echo -e "${YELLOW}│${NC} ${CYAN}SCANNING${NC}: Looking for ${GREEN}Firefox${NC} tabs... ${YELLOW}│${NC}" | |
echo -e "${YELLOW}└──────────────────────────────────────────────────────────────────────────┘${NC}" | |
local ff_tabs_killed=0 | |
local ff_memory_freed=0 | |
display_loading "INITIALIZING SCAN" | |
pgrep -f -a 'firefox' | grep -v "MainThread" | while read pid cmd; do | |
# Get memory usage before killing | |
local mem_info=$(ps -o rss= -p $pid 2>/dev/null) | |
if [ -n "$mem_info" ]; then | |
# Convert KB to MB and add to total | |
local mem_mb=$(convert_to_mb $mem_info) | |
ff_memory_freed=$(echo "scale=2; $ff_memory_freed + $mem_mb" | bc) | |
total_memory_freed=$(echo "scale=2; $total_memory_freed + $mem_mb" | bc) | |
fi | |
echo -e "${RED}■ TERMINATING${NC} Firefox [PID:$pid] ${YELLOW}(${mem_mb:-0} MB)${NC}" | |
kill $pid | |
ff_tabs_killed=$((ff_tabs_killed + 1)) | |
total_tabs_killed=$((total_tabs_killed + 1)) | |
sleep 0.05 # Slow down for visual effect | |
done | |
if [ $ff_tabs_killed -gt 0 ]; then | |
echo -e "${YELLOW}┌──────────────────────────────────────────────────────────────────────────┐${NC}" | |
echo -e "${YELLOW}│${NC} ${GREEN}COMPLETE${NC}: Firefox - Terminated $ff_tabs_killed processes / Freed ${ff_memory_freed} MB ${YELLOW}│${NC}" | |
echo -e "${YELLOW}└──────────────────────────────────────────────────────────────────────────┘${NC}" | |
echo "" | |
else | |
echo -e "${BLUE}>> No Firefox tabs found <<${NC}" | |
echo "" | |
fi | |
} | |
# Clear screen for dramatic effect | |
clear | |
# Display banner | |
display_banner | |
echo "" | |
display_box "BROWSER TAB KILLER - MEMORY OPTIMIZER" | |
echo "" | |
echo -e "${CYAN}[INFO]${NC} Tabs will remain in place for manual reload when needed" | |
echo -e "${CYAN}[INFO]${NC} Memory will be freed immediately" | |
echo "" | |
sleep 1 | |
# Chromium-based browsers | |
kill_browser_tabs "Chrome" "chrome" | |
kill_browser_tabs "Chromium" "chromium" | |
kill_browser_tabs "Brave" "brave" | |
kill_browser_tabs "Microsoft Edge" "msedge" | |
kill_browser_tabs "Opera" "opera" | |
kill_browser_tabs "Vivaldi" "vivaldi" | |
# Firefox | |
kill_firefox_tabs | |
# Print overall summary with ASCII art frame | |
echo -e "${GREEN}╔══════════════════════════════════════════════════════════════════════════╗${NC}" | |
echo -e "${GREEN}║${NC} ${PURPLE}OPERATION COMPLETE${NC} ${GREEN}║${NC}" | |
echo -e "${GREEN}╠══════════════════════════════════════════════════════════════════════════╣${NC}" | |
echo -e "${GREEN}║${NC} ▶ Total tabs terminated: ${YELLOW}$total_tabs_killed${NC} ${GREEN}║${NC}" | |
echo -e "${GREEN}║${NC} ▶ Total memory recovered: ${YELLOW}${total_memory_freed}${NC} MB ${GREEN}║${NC}" | |
echo -e "${GREEN}╚══════════════════════════════════════════════════════════════════════════╝${NC}" | |
echo "" | |
echo -e "${BLUE}System optimized. Press any key to continue...${NC}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment