#!/bin/bash
#=====================================================
# 进程管理脚本 - 查找/杀死僵尸进程、高资源进程
# 来源: 整合自 oldratlee/useful-scripts
# 用法: ./process-manager.sh [zombie|top|killz]
#=====================================================

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

show_help() {
    echo "用法: $0 <命令>"
    echo ""
    echo "命令:"
    echo "  zombie    - 查找僵尸进程及其父进程"
    echo "  top       - 显示TOP 10 CPU/内存进程"
    echo "  killz     - 尝试清理僵尸进程"
    echo "  search    - 搜索进程 (需提供关键词)"
    echo "  count     - 统计各用户进程数"
    echo ""
}

# 查找僵尸进程
find_zombie() {
    echo -e "${RED}===== 僵尸进程 =====${NC}"
    ZOMBIE=$(ps aux | awk '{if($8=="Z") print}')
    if [ -z "$ZOMBIE" ]; then
        echo -e "${GREEN}✓ 无僵尸进程${NC}"
    else
        echo "$ZOMBIE"
        echo ""
        echo -e "${YELLOW}僵尸进程的父进程:${NC}"
        ps aux | awk '{if($8=="Z") print $2}' | while read pid; do
            PPID=$(ps -o ppid= -p "$pid" 2>/dev/null | xargs)
            if [ -n "$PPID" ]; then
                ps -o pid,ppid,user,comm -p "$PPID" 2>/dev/null
            fi
        done
    fi
}

# TOP进程
show_top() {
    echo -e "${BLUE}===== TOP 10 CPU 进程 =====${NC}"
    ps aux --sort=-%cpu | head -11 | awk '{printf "%-8s %-6s %-6s %-12s %s\n", $2, $3"%", $4"%", $1, $11}'
    echo ""
    echo -e "${BLUE}===== TOP 10 内存 进程 =====${NC}"
    ps aux --sort=-%mem | head -11 | awk '{printf "%-8s %-6s %-6s %-12s %s\n", $2, $3"%", $4"%", $1, $11}'
}

# 清理僵尸进程
kill_zombie() {
    echo -e "${YELLOW}尝试清理僵尸进程...${NC}"
    ZOMBIE_PIDS=$(ps aux | awk '{if($8=="Z") print $2}')
    if [ -z "$ZOMBIE_PIDS" ]; then
        echo -e "${GREEN}✓ 无僵尸进程需要清理${NC}"
        return
    fi

    for pid in $ZOMBIE_PIDS; do
        PPID=$(ps -o ppid= -p "$pid" 2>/dev/null | xargs)
        if [ -n "$PPID" ] && [ "$PPID" != "1" ]; then
            echo "  向父进程 $PPID 发送 SIGCHLD 信号..."
            kill -SIGCHLD "$PPID" 2>/dev/null
        fi
    done
    sleep 1
    echo ""
    find_zombie
}

# 搜索进程
search_process() {
    local keyword=$1
    if [ -z "$keyword" ]; then
        echo -e "${RED}请提供搜索关键词${NC}"
        return
    fi
    echo -e "${BLUE}搜索包含 '${keyword}' 的进程:${NC}"
    ps aux | grep -i "$keyword" | grep -v grep | awk '{printf "%-8s %-6s %-6s %-12s %s\n", $2, $3"%", $4"%", $1, $11}'
}

# 统计用户进程
count_process() {
    echo -e "${BLUE}===== 各用户进程数统计 =====${NC}"
    ps aux | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn | awk '{printf "%-12s %s\n", $2, $1}'
}

case "${1:-}" in
    zombie)   find_zombie ;;
    top)      show_top ;;
    killz)    kill_zombie ;;
    search)   search_process "$2" ;;
    count)    count_process ;;
    *)        show_help ;;
esac