首页 > 系统相关 >shell_AWK 获取系统状态信息

shell_AWK 获取系统状态信息

时间:2024-09-07 14:52:39浏览次数:17  
标签:load shell log 获取 AWK print awk 日志 disk

#!/bin/bash
# 定义巡检日志文件路径,所有日志将记录在此文件中
LOG_FILE="/var/log/system_inspection.log"

# 定义一个函数,将消息输出到日志文件并同时显示在屏幕上
log() {
    # 使用 `date` 获取当前时间,并将消息格式化后追加到日志文件,同时输出到屏幕
    echo "$(date +"%Y-%m-%d %H:%M:%S") : $*" | tee -a "$LOG_FILE"
}

# 系统类型检查函数,用于判断系统的包管理工具
os_check() {
    # 检查是否是基于 Red Hat 的系统(CentOS/RedHat)
    if [ -e /etc/redhat-release ]; then
        # 提取 Red Hat 系统的发行版本名称
        REDHAT=$(awk '{print $1}' /etc/redhat-release)
    else
        # 如果不是 Red Hat 系统,则检查是否是 Debian 系列系统(如 Ubuntu)
        DEBIAN=$(awk '{print $1}' /etc/issue)
    fi

    # 根据不同的系统,确定使用 yum 还是 apt-get 作为包管理器
    if [[ "$REDHAT" == "CentOS" || "$REDHAT" == "Red" ]]; then
        P_M="yum"  # CentOS/Red Hat 使用 yum
    elif [[ "$DEBIAN" == "Ubuntu" || "$DEBIAN" == "ubuntu" ]]; then
        P_M="apt-get"  # Ubuntu 使用 apt-get
    else
        # 如果不是支持的系统,记录日志并退出脚本
        log "Operating system does not support."
        exit 1
    fi
}

# 检查当前是否是以 root 用户身份执行脚本
if [ "$LOGNAME" != "root" ]; then
    # 如果不是 root 用户,则提示用户并退出
    log "Please use the root account operation."
    exit 1
fi

# 定义一个函数,用于检查并安装所需的系统工具
install_tool() {
    local tool_name="$1"
    local package_name="$2"
    # 使用 `which` 检查工具是否已安装
    if ! which "$tool_name" &>/dev/null; then
        # 如果工具未安装,记录日志并安装
        log "$tool_name not found, installing..."
        os_check  # 先调用系统检查函数,确保已确定包管理工具
        $P_M install "$package_name" -y | tee -a "$LOG_FILE"  # 安装工具并将过程记录到日志
    fi
}

# 检查并安装 vmstat 和 iostat 工具
install_tool "vmstat" "procps"
install_tool "iostat" "sysstat"

# 定义 CPU 负载监控功能
cpu_load() {
    log "Checking CPU load..."
    # 连续执行3次CPU监控,每秒获取一次数据
    for i in {1..3}; do
        log "Sample $i:"  # 每次循环时记录样本编号
        # 使用 vmstat 提取 CPU 利用率、用户使用、系统使用和I/O等待时间,并写入日志
        vmstat | awk 'NR==3 { print "Util:", 100-$15"%", "User:", $13"%", "System:", $14"%", "I/O wait:", $16"%" }' | tee -a "$LOG_FILE"
        sleep 1  # 每次间隔1秒
    done
}

# 定义硬盘 I/O 负载监控功能
disk_load() {
    log "Checking Disk I/O load..."
    # 连续执行3次硬盘I/O监控,每秒获取一次数据
    for i in {1..3}; do
        log "Sample $i:"  # 每次循环时记录样本编号
        # 使用 iostat 提取每个硬盘的利用率、读写速度,并写入日志
        iostat -x -k | awk '/^[v|s]/{OFS=": "; print $1, "Util:", $NF"%", "Read/s:", $6"KB", "Write/s:", $7"KB"}' | tee -a "$LOG_FILE"
        sleep 1  # 每次间隔1秒
    done
}

# 定义硬盘使用率检查功能
disk_use() {
    log "Checking Disk usage..."
    # 使用 df -h 检查所有分区的使用率,如果使用率超过 90%,记录到日志
    df -h | awk '/^\/dev/ && int(substr($5, 1, length($5)-1)) > 90 { print $6 " = " $5 }' | tee -a "$LOG_FILE"
}

# int(substr($5, 1, length($5)-1))
# $5+0   
# 这两种写法都可以实现的都是将字符串转整数  然后进行计算比较 
# 学习阶段都练习一下

# 定义硬盘 inode 使用率检查功能
disk_inode() {
    log "Checking Disk inode usage..."
    # 使用 df -i 检查所有分区的 inode 使用率,如果 inode 使用率超过 90%,记录到日志
    df -i | awk '/^\/dev/ && $5+0 > 90 { print $6 " = " $5 }' | tee -a "$LOG_FILE"
}

# 定义内存使用率检查功能
mem_use() {
    log "Checking Memory usage..."
    # 使用 free -m 获取内存总量、已使用量、空闲量,并记录到日志
    free -m | awk '/^Mem:/ { print "Total:", $2"MB", "Used:", $3"MB", "Free:", $4"MB" }' | tee -a "$LOG_FILE"
}

# 定义 TCP 连接状态检查功能
tcp_status() {
    log "Checking TCP connection status..."
    # 使用 ss -ant 检查TCP连接状态,并统计各状态的数量,记录到日志
    ss -ant | awk '!/State/ { status[$1]++ } END { for (i in status) print i, status[i] }' | tee -a "$LOG_FILE"
}

# 定义 CPU 占用前10个进程检查功能
cpu_top10() {
    log "Checking top 10 CPU consuming processes..."
    # 使用 ps 命令获取占用 CPU 前10个进程,并记录到日志
    ps aux --sort=-%cpu | awk 'NR<=11 { print $2, $3"%", $11 }' | tee -a "$LOG_FILE"
}

# 定义内存占用前10个进程检查功能
mem_top10() {
    log "Checking top 10 Memory consuming processes..."
    # 使用 ps 命令获取占用内存前10个进程,并记录到日志
    ps aux --sort=-%mem | awk 'NR<=11 { print $2, $4"%", $11 }' | tee -a "$LOG_FILE"
}

# 定义网络流量检查功能
traffic() {
    # 提示用户输入网卡名称
    read -p "Enter network card name (e.g., eth0): " eth
    # 检查输入的网卡名称是否有效
    if ifconfig "$eth" &>/dev/null; then
        log "Checking Network traffic on $eth..."

        # 连续执行3次网络流量检查,每秒获取一次数据
        for i in {1..3}; do
            # 获取当前的网络流量信息
            traffic_info=$(ifconfig "$eth")

            # 从网络流量信息中提取 RX 和 TX 字节数
            OLD_IN=$(echo "$traffic_info" | awk '/RX bytes/ {print $5}' | cut -d: -f2)
            OLD_OUT=$(echo "$traffic_info" | awk '/TX bytes/ {print $5}' | cut -d: -f2)

            # 等待1秒
            sleep 1

            # 获取新的网络流量信息
            traffic_info=$(ifconfig "$eth")

            # 从新的网络流量信息中提取 RX 和 TX 字节数
            NEW_IN=$(echo "$traffic_info" | awk '/RX bytes/ {print $5}' | cut -d: -f2)
            NEW_OUT=$(echo "$traffic_info" | awk '/TX bytes/ {print $5}' | cut -d: -f2)

            # 计算进出流量差值,并记录到日志
            RX_DIFF=$((NEW_IN - OLD_IN))
            TX_DIFF=$((NEW_OUT - OLD_OUT))
            log "In: $RX_DIFF Bytes, Out: $TX_DIFF Bytes"
        done
    else
        # 如果网卡名称无效,记录日志
        log "Invalid network card name."
    fi
}

# 主功能菜单,使用 select 提供交互选项
while true; do
    select input in cpu_load disk_load disk_use disk_inode mem_use tcp_status cpu_top10 mem_top10 traffic quit all_check; do
        case $input in
            cpu_load) cpu_load ;;
            disk_load) disk_load ;;
            disk_use) disk_use ;;
            disk_inode) disk_inode ;;
            mem_use) mem_use ;;
            tcp_status) tcp_status ;;
            cpu_top10) cpu_top10 ;;
            mem_top10) mem_top10 ;;
            traffic) traffic ;;
            quit)
                log "Exiting."
                exit 0
                ;;
            # 执行所有检查功能
            all_check)
                log "Starting Full System Check..."
                cpu_load
                disk_load
                disk_use
                disk_inode
                mem_use
                tcp_status
                cpu_top10
                mem_top10
                traffic
                log "Full System Check Completed."
                break
                ;;
            # 处理无效选项
            *)
                log "Invalid option."
                ;;
        esac
    done
done

标签:load,shell,log,获取,AWK,print,awk,日志,disk
From: https://blog.csdn.net/qq_43527128/article/details/141988687

相关文章

  • 探索最佳 Shell 工具:全面测评 Bash、Zsh、Fish、Tcsh 和 Ksh
    感谢浪浪云支持发布浪浪云活动链接:https://langlangy.cn/?i8afa52文章目录1.简介2.测评工具3.测评标准4.Bash测评4.1易用性4.2功能特性4.3性能4.4可定制性4.5社区和支持5.Zsh测评5.1易用性5.2功能特性5.3性能5.4可定制性5.5社区和支持6.Fish测......
  • Shell脚本字符串处理(Linux篇)
    1.字符串处理1.1.cutcut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。语法格式如下:命令格式:cut[选项]文件名选项参数说明:选项说明-b选中第几个字符-c选中多少个字符-d按照指定分割符进行分割,默认的分割符是制表符,注意分割符不能使用......
  • shell脚本监控一个进程号,进程号没有就输出error
    你可以使用一个简单的Shell脚本来监控进程号(PID),如果进程不存在则输出error。以下是一个示例脚本:#!/bin/bash#输入要监控的进程号pid=$1#检查进程是否存在ifps-p$pid>/dev/nullthenecho"Process$pidisrunning."elseecho"error:Process$pid......
  • Shell脚本流程控制(Linux篇)
    1.流程控制流程控制是改变程序运行顺序的指令。1.1.条件判断1.1.1.文件类型判断参数说明-d判断指定的目录是否存在-e判断文件是否存在,存在即为真-f判断普通文件是否存在-L判断文件是否存在且为连接文件示例一:#判断文件是否存在,存在为0,不存在为1root@zking:~#test-ea......
  • Thread 类的使用,如何创建、终止、等待一个线程以及获取线程的状态
    线程是什么线程是操作系统中调度的基本单位,是比进程更小的执行单元。线程在进程内部运行,共享该进程的资源,如内存和文件句柄,但每个线程都有自己的执行栈和程序计数器。线程的主要特点包括:轻量级:线程相较于进程更加轻量,创建和销毁的开销较小。共享资源:同一进程中的线程共享该进程的内......
  • linux之shell
    Shell编程shell简介shell的作用1.解释执行用户输入的程序或者指令2.用户输入一条指令,shell解释一条3.键盘输入指令,Linux给与响应-----这个过程称之为交互式响应流程shell是一块包裹着系统核心的壳,处于操作系统的最外层,与用户直接对话,shell可以把用户的输入,解释......
  • jsp仓储管理系统9e8ai 本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上
    jsp仓储管理系统9e8ai本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能客户,库存人员,入库人员,出库人员,商品类别,商品信息,仓区信息,商品入库,商品出库开题报告内容一、项目背景与意义随着电子商......