Linux运维脚本

#!/bin/bash
echo "      ___           ___         ___
     /  /\         /  /\       /__/\
    /  /:/_       /  /::\      \  \:\
   /  /:/ /\     /  /:/\:\      \  \:\
  /  /:/ /::\   /  /:/~/:/  _____\__\:\
 /__/:/ /:/\:\ /__/:/ /:/  /__/::::::::\
 \  \:\/:/~/:/ \  \:\/:/   \  \:\~~\~~\/
  \  \::/ /:/   \  \::/     \  \:\  
   \__\/ /:/     \  \:\      \  \:\
     /__/:/       \  \:\      \  \:\
     \__\/         \__\/       \__\/
"
echo "SPN 日常巡查脚本输出"
# 清理屏幕
clear

function bash_os() {
    # "系统基础信息"

    #内核信息
    kernel=$(uname -r)
    #操作系统版本
    release=$(cat /etc/redhat-release)
    #主机名称
    hostname=$HOSTNAME
    #当前时间及运行时间
    dateload=$(uptime | awk -F "," '{print $1}')
    # 当前登录用户数
    users=$(uptime | awk -F "," '{print $3}')

    echo -e "\n\033[32m##############   系统基础信息 #######\033[0m\n"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|内核信息:\033[31m        $kernel           \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|操作系统版本:\033[31m   $release        \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|当前时间及运行时间:\033[31m   $dateload        \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|当前登录用户数:\033[31m   $users        \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
}

function memory() {

    # 内存相关数据统计`free -m`
    #总内存容量
    mem_total=$(free -m | awk '/Mem/{printf "%.2fG", $2/1024}')
    # 用户程序占用内存量
    mem_user=$(free -m | awk '/Mem/{printf "%.2fG", $3/1024}')
    #  多进程共享占用内存量
    mem_shared=$(free -m | awk '/Mem/{printf "%.2fG", $5/1024}')
    #缓存占用内存量
    mem_buff_cache=$(free -m | awk '/Mem/{printf "%.fMB",  $(NF-1)}')
    #空闲内存容量
    mem_free=$(free -m | awk '/Mem/{printf "%.2fG", $4/1024 }')
    # 剩余可用内存容量
    mem_available=$(free -m | awk 'NR==2{printf "%.2fG",$NF/1024}')
    # 可用内存使用占比
    mem_percentage=$(free -m | awk '/Mem/{printf "%.2f", $NF/$2*100}')
    #总的交换分区容量
    swap_total=$(free -m | awk '/Swap/{printf "%.2fG", $2/1024}')
    #用户使用的交换分区容量
    swap_user=$(free -m | awk '/Swap/{printf "%.2fG",$3/1024}')
    #剩余交换分区容量
    swap_free=$(free -m | awk '/Swap/{printf "%.2fG",$4/1024}')
    #可用交换分区占比
    swap_percentage=$(free -m | awk '/Swap/{printf "%.2f",$4/$2*100}')
    #占用内存资源最多的10个进程列表
    top_proc_mem=$(ps --no-headers -eo rss,args | sort -k1 -n -r | head -10)

    echo -e "\n\033[32m################## 内存 ############\033[0m\n"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|总内存容量:\033[31m        $mem_total           \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|用户程序内存量:\033[31m   $mem_user        \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|多进程共享内存量:\033[31m $mem_shared     \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|缓存占用内存量:\033[31m   $mem_buff_cache    \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|空闲内存容量:\033[31m     $mem_free           \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|剩余可用内存容量:\033[31m  $mem_available    \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|可用内存百分比:\033[31m   $mem_percentage%   \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "\033[32m############## 交换分区 #############\033[0m\n"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "总的交换分区容量:\033[31m    $swap_total    \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|用户使用的交换分区容量:\033[31m   $swap_user   \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|剩余交换分区容量:\033[31m  ${swap_free}"
    echo -e "\033[32m------------------------------------\033[0m"
    if [ $(free -m | awk '/Swap/{print $2}') -ne 0 ]; then

        echo -e "|可用交换分区占比:\033[31m  $swap_percentage%    \033[0m"
        echo -e "\033[32m------------------------------------\033[0m"
    fi
    echo -e "|占用内存资源最多的10个进程列表:"
    echo -e "\033[31m$top_proc_mem%    \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
}

function cpu() {
    #CPU型号
    cpu_info=$(LANG=C lscpu | awk -F: '/Model name/ {print $2}')

    #CPU内核数量
    cpu_core=$(awk '/processor/{core++} END{print core}' /proc/cpuinfo)

    #CPU最近1/5/15分钟的平均负载
    load1515=$(uptime | sed 's/,/ /g' | awk '{for(i=NF-2;i<=NF;i++)print $i }' | xargs)

    #发生中断数量
    irq=$(vmstat 1 1 | awk 'NR==3{print $11}')

    #上下文切换数量
    cs=$(vmstat 1 1 | awk 'NR==3{print $12}')

    #占用CPU资源最多的10个进程列表
    top_proc_cpu=$(ps --no-headers -eo %cpu,args | sort -k1 -n -r | head -10)

    echo -e "\n\033[32m################## CPU 相关 ############\033[0m\n"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|CPU型号:\033[31m$cpu_info           \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|CPU内核数量:\033[31m$cpu_core        \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|CPU最近1/5/15分钟的平均负载:\033[31m$load1515        \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|CPU中断数量:\033[31m$irq        \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|上下文切换数量:\033[31m$cs        \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|占用CPU资源最多的10个进程列表:"
    echo -e "\033[31m$top_proc_cpu           \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"

}

function disk_io() {
    #分区挂载信息
    disk=$(df -h)
    # 磁盘总数
    disk_total=$(vmstat -D | awk 'NR==1{print $1}')
    # 分区总数
    disk_sub=$(vmstat -D | awk 'NR==2{print $1}')
    #磁盘分区信息
    lsblk_=$(lsblk -n)
    #写入磁盘的总块数
    bo=$(vmstat 1 1 | awk 'NR==3{print $10}')
    #从磁盘读出的块数
    bi=$(vmstat 1 1 | awk 'NR==3{print $9}')
    #每秒写磁盘块的速率
    wa=$(vmstat 1 1 | awk 'NR==3{print $16}')

    echo -e "\n\033[32m################## 磁盘IO 相关 ############\033[0m\n"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|磁盘总数:\033[31m$disk_total           \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|分区总数:\033[31m$disk_sub        \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|磁盘分区信息:"
    echo -e "\033[31m$lsblk_           \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|写入磁盘的总块数:\033[31m$bo       \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|从磁盘读出的块数:\033[31m$bi       \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|每秒写磁盘块的速率:\033[31m$wa       \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|分区挂载信息:"
    echo -e "\033[31m$disk           \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"

}

function procs() {
    #进程数量
    procs=$(ps aux | wc -l)
    #用户的最大进程数
    ulimit_=$(ulimit -u)
    #内核设置的最大进程数
    pid_max=$(sysctl kernel.pid_max | awk '{print $3}')

    echo -e "\n\033[32m################## 进程 相关 ############\033[0m\n"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|进程数量:\033[31m$procs       \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|用户的最大进程数:\033[31m$ulimit_       \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|内核设置的最大进程数:\033[31m$pid_max       \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"

}

function network() {
    #获取网卡流量信息,接收|发送的数据流量,单位为字节(bytes)
    net_monitor=$(cat /proc/net/dev | tail -n +3 | awk 'BEGIN{ print "网卡名称 入站数据流量(bytes) 出站数据流量(bytes)"} {print $1,$2,$10}' | column -t)
    #获取暴露端口信息
    ip_port=$(ss -ntulpa)

     #本地IP地址列表
    localip=$(ip a s | awk '/inet /{print $2}' )


    echo -e "\n\033[32m################## 网络 相关 ############\033[0m\n"
    echo -e "|本地IP地址列表:"
    echo -e "\033[31m$localip    \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|获取网卡流量信息:"
    echo -e "\033[31m$net_monitor           \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"
    echo -e "|获取暴露端口信息:"
    echo -e "\033[31m$ip_port           \033[0m"
    echo -e "\033[32m------------------------------------\033[0m"

}

case $1 in
all)
    bash_os
    memory
    cpu
    disk_io
    procs
    network
    ;;
bash_os)
    bash_os
    ;;
memory)
    memory
    ;;
cpu)
    cpu
    ;;
disk_io)
    disk_io
    ;;
procs)
    procs
    ;;
network)
    network
    ;;
*)
    echo "Usage: bash_os|memory|cup|disk_io|procs|network|all"
    ;;
esac

命令分析:

1、uname  -r  显示内核信息      `` 与$() 命令的等价的   建议使用$()

 2、cat  /etc/redhat-release 显示系统版本信息

3、hostname  显示主机名

4、uptime

 

 #当前服务器时间:    22:25:22

#当前服务器运行时长   4天
#当前用户数          3 users
#当前的负载均衡      load average  0.00, 0.01, 0.05,分别取1min,5min,15min的均值

另:系统平均负载是指在特定时间间隔内运行队列中的平均进程数。

如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的。如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。如果你的linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。

5、awk命令

-F参数:指定分隔符,可指定一个或多个

print 后面做字符串的拼接

 

awk '{pattern + action}' {filenames}

 awk '$2 >80 {print}' zh.txt 匹配成绩大于80的学生信息并输出

awk '/^X/ {print} '  zh.txt 匹配学生姓名以X开头的信息

awk '/^(张|李/ {print}' 匹配学生姓名以张或李开头的学生信息。

 尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

 

 

 
shell脚本运行时间,下次用到可直接copy
starttime=`date +'%Y-%m-%d %H:%M:%S'`
 需执行的程序
 endtime=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date="$starttime" +%s);
end_seconds=$(date --date="$endtime" +%s);
echo "本次运行时间: "$((end_seconds-start_seconds))"s"

 

 

posted on 2022-03-01 22:59  小破孩楼主  阅读(163)  评论(0编辑  收藏  举报