这个脚本适用于系统管理员监控系统中文件描述符使用情况,特别是可以帮助发现那些可能存在文件描述符泄漏的进程,或者需要调整文件描述符限制的进程
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 变量"
使用示例
-
默认阈值(80%)监控
直接执行脚本,仅显示使用率≥80%的进程:chmod +x fd_monitor.sh # 给脚本加执行权限 ./fd_monitor.sh -
自定义阈值(50%)监控
通过-t参数指定阈值,显示使用率≥50%的进程:./fd_monitor.sh -t 50 -
查看帮助
查看脚本用法和参数说明:./fd_monitor.sh -h
1019

被折叠的 条评论
为什么被折叠?



