【shell工具】如何用脚本监控进程文件描述符高占用情况

这个脚本适用于系统管理员监控系统中文件描述符使用情况,特别是可以帮助发现那些可能存在文件描述符泄漏的进程,或者需要调整文件描述符限制的进程

shell 代码

#!/bin/bash
##############################################################################
# 脚本功能:监控系统进程的文件描述符使用情况,筛选出使用率超过指定阈值的进程
# 核心特性:
#   1. 阈值可在顶部变量配置,无需修改代码逻辑
#   2. 跳过无权限访问的进程和“无限制”文件描述符的进程
#   3. 结果按使用率从高到低排序,输出关键信息(PID、进程名、使用量、限制、使用率)
# 使用方式:直接执行脚本,或通过 -t 参数指定阈值(如 ./fd_monitor.sh -t 80)
##############################################################################

# ========================== 可配置变量(按需调整)==========================
# 默认文件描述符使用率阈值(百分比),低于此值的进程不输出
DEFAULT_THRESHOLD=80
# ============================================================================

# 定义函数:显示脚本使用帮助
show_help() {
    echo "用法:$0 [选项]"
    echo "  监控系统进程的文件描述符使用情况,输出使用率超过阈值的进程"
    echo
    echo "  选项:"
    echo "    -t, --threshold  [数值]  指定使用率阈值(百分比,0-100),默认值:$DEFAULT_THRESHOLD"
    echo "    -h, --help               显示此帮助信息"
    echo
    echo "  示例:"
    echo "    $0                      使用默认阈值($DEFAULT_THRESHOLD%)监控"
    echo "    $0 -t 50                监控使用率超过50%的进程"
    echo "    $0 --threshold 90       监控使用率超过90%的进程"
}

# 解析命令行参数(支持 -t/--threshold 指定阈值,-h/--help 显示帮助)
parse_args() {
    # 初始化阈值为默认值
    CURRENT_THRESHOLD=$DEFAULT_THRESHOLD

    # 循环解析参数
    while [[ $# -gt 0 ]]; do
        case "$1" in
            -t|--threshold)
                # 检查参数是否为合法数字(0-100的整数)
                if [[ $2 =~ ^[0-9]+$ ]] && [ $2 -ge 0 ] && [ $2 -le 100 ]; then
                    CURRENT_THRESHOLD=$2
                    shift 2  # 跳过参数名和参数值
                else
                    echo "错误:阈值必须是0-100之间的整数!" >&2
                    show_help
                    exit 1
                fi
                ;;
            -h|--help)
                show_help
                exit 0
                ;;
            *)
                # 未知参数
                echo "错误:未知选项 '$1'!" >&2
                show_help
                exit 1
                ;;
        esac
    done
}

# 核心逻辑:遍历进程并检查文件描述符使用情况
check_fd_usage() {
    echo "==================================== 进程文件描述符监控结果 ===================================="
    echo "阈值设置:仅显示使用率 ≥ $CURRENT_THRESHOLD% 的进程"
    echo "==============================================================================================="
    echo "PID       进程名               当前使用FD数   FD限制数     使用率"
    echo "-----------------------------------------------------------------------------------------------"

    # 遍历 /proc 目录下所有数字命名的进程ID(排除非进程目录)
    for pid in $(ls -1 /proc | grep -E '^[0-9]+$'); do
        # 1. 跳过无权限访问的进程(无limits文件或fd目录)
        if [ ! -r "/proc/$pid/limits" ] || [ ! -d "/proc/$pid/fd" ]; then
            continue
        fi

        # 2. 获取进程的文件描述符软限制(Max open files 的第4列)
        soft_limit=$(grep "Max open files" /proc/$pid/limits | awk '{print $4}')
        # 跳过“无限制”的进程(soft_limit 为 unlimited)
        if [ "$soft_limit" = "unlimited" ]; then
            continue
        fi

        # 3. 计算当前打开的文件描述符数量(fd目录下的条目数)
        # 2>/dev/null 屏蔽可能的权限警告(部分fd文件可能无法访问)
        fd_count=$(ls -1 /proc/$pid/fd 2>/dev/null | wc -l)

        # 4. 计算使用率(避免除零错误:若soft_limit为0,直接跳过)
        if [ "$soft_limit" -eq 0 ]; then
            continue
        fi
        usage_rate=$(( fd_count * 100 / soft_limit ))

        # 5. 获取进程名(comm文件存储进程名,2>/dev/null 屏蔽临时进程的读取错误)
        comm=$(cat /proc/$pid/comm 2>/dev/null)
        # 若进程名读取失败,用“unknown”替代
        if [ -z "$comm" ]; then
            comm="unknown"
        fi

        # 6. 筛选:仅输出使用率 ≥ 阈值的进程,并格式化输出(对齐列)
        if [ "$usage_rate" -ge "$CURRENT_THRESHOLD" ]; then
            # printf 格式化:确保列对齐,提升可读性
            printf "%-8s %-20s %-12s %-10s %-3s%%\n" \
                "$pid" "$comm" "$fd_count" "$soft_limit" "$usage_rate"
        fi
    done | sort -k5 -nr  # 按“使用率”(第5列)从高到低排序
}

# ========================== 脚本执行入口 ===========================
# 1. 解析命令行参数
parse_args "$@"

# 2. 执行核心监控逻辑
check_fd_usage

echo -e "\n提示:若需调整阈值,可使用 -t 参数(如 ./fd_monitor.sh -t 50),或修改脚本顶部的 DEFAULT_THRESHOLD 变量"

使用示例

  1. 默认阈值(80%)监控
    直接执行脚本,仅显示使用率≥80%的进程:

    chmod +x fd_monitor.sh  # 给脚本加执行权限
    ./fd_monitor.sh
    
  2. 自定义阈值(50%)监控
    通过 -t 参数指定阈值,显示使用率≥50%的进程:

    ./fd_monitor.sh -t 50
    
  3. 查看帮助
    查看脚本用法和参数说明:

    ./fd_monitor.sh -h
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值