当前位置: 首页 > 科技观察

一键获取Linux内存、CPU、磁盘IO等信息脚本编写,及其原理详解

时间:2023-03-11 23:38:58 科技观察

1.脚本今天主要分享一个shell脚本,用于获取Linux系统CPU、内存、磁盘IO等信息。#!/bin/bash#获取本地待监控服务器的IP地址IP=`ifconfig|grepinet|grep-vE'inet6|127.0.0.1'|awk'{print$2}'`echo"IP地址:"$IP#获取CPU核心总数cpu_num=`grep-c"modelname"/proc/cpuinfo`echo"CPU核心总数:"$cpu_num#1,获取CPU利用率####################################################us用户空间占用CPU百分比#sy内核空间占用CPU百分比#ni用户进程空间中优先级发生变化的进程占用CPU的百分比#id空闲CPU百分比#wa等待输入输出的CPU时间百分比#hi硬件中断#si软件中断###################################################获取用户空间CPU占用百分比cpu_user=`top-b-n1|grepCpu|awk'{print$2}'|cut-f1-d"%"`echo"用户空间占用的CPU百分比:"$cpu_user#获取内核空间占用的CPU百分比cpu_system=`top-b-n1|grepCpu|awk'{print$4}'|cut-f1-d"%"`echo"内核空间占用的CPU百分比:"$cpu_system#获取空闲CPU百分比cpu_idle=`top-b-n1|grepCpu|awk'{print$8}'|cut-f1-d"%"`echo"IdleCPUpercentage:"$cpu_idle#获取CPU等待输入输出的百分比cpu_iowait=`top-b-n1|grepCpu|awk'{print$10}'|cut-f1-d"%"`echo"等待输入输出占CPU百分比:"$cpu_iowait#2,获取CPU上下文切换和中断次数#getCPU中断次数cpu_interrupt=`vmstat-n11|sed-n3p|awk'{打印$11}'`echo"CPU中断次数:"$cpu_interrupt#GetCPUcontextswitchtimescpu_context_switch=`vmstat-n11|sed-n3p|awk'{print$12}'`echo"CPUcontextswitchtimes:"$cpu_context_switch#3,getCPUloadInformation#获取CPU从15分钟前到现在的负载平均值cpu_load_15min=`uptime|awk'{print$11}'|cut-f1-d','`echo"从15分钟开始的CPU负载平均值minutesagotothepresent:"$cpu_load_15min#获取CPU从5分钟前到现在的平均负载cpu_load_5min=`uptime|awk'{print$10}'|cut-f1-d','`echo"平均从5分钟前到现在的CPU负载:"$cpu_load_5min#GetCPU1cpu_load_1min=`uptime|awk'{print$9}'|cut-f1-d','`echo"从1分钟前到现在的CPU平均负载now:"$cpu_load_1min#Gettaskqueue(等待就绪状态的进程数)cpu_task_length=`vmstat-n11|sed-n3p|awk'{print$1}'`echo"CPUtaskqueuelength:"$cpu_task_length#4.获取内存信息#获取物理内存总量mem_total=`free|grepMem|awk'{print$2}'`echo"totalphysicalmemory:"$mem_total#获取操作系统使用的内存总量mem_sys_used=`free|grepMem|awk'{print$3}'`echo"已经使用内存总量(操作系统):"$mem_sys_used#获取操作系统未使用内存总量mem_sys_free=`free|grepMem|awk'{print$4}'`echo"剩余内存总量(操作系统):"$mem_sys_free#获取应用使用的内存总量mem_user_used=`free|sed-n3p|awk'{print$3}'`echo"使用内存总量(应用):"$mem_user_used#获取应用未使用内存总量mem_user_free=`free|sed-n3p|awk'{print$4}'`echo"Totalremainingmemory(application):"$mem_user_free#获取swap分区总大小mem_swap_total=`free|grepSwap|awk'{print$2}'`echo"swap分区总大小:"$mem_swap_total#获取已用交换分区的大小mem_swap_used=`free|grepSwap|awk'{print$3}'`echo"usedswappartitionsize:"$mem_swap_used#getremainingswappartitionsizemem_swap_free=`free|grepSwap|awk'{print$4}'`echo"remainingSwappartitionsize:"$mem_swap_free#5,getdiskI/Ostatisticsecho"statisticsofspecifieddevice(/dev/sda)"#每秒向设备发起的读取请求数disk_sda_rs=`iostat-kx|grepsda|awk'{print$4}'`echo"每秒对设备的读请求数:"$disk_sda_rs#每秒对设备的写请求数disk_sda_ws=`iostat-kx|grepsda|awk'{print$5}'`echo"每秒向设备发起的写请求数:"$disk_sda_ws#向设备发起的I/O请求队列的平均长度disk_sda_avgqu_sz=`iostat-kx|grepsda|awk'{print$9}'`echo"向设备发起的I/O请求队列的平均长度"$disk_sda_avgqu_sz#每次向设备发起I/O请求的平均时间AverageI/Orequesttime:"$disk_sda_await#I的平均值/O设备disk_sda_sv发起的服务时间ctm=`iostat-kx|grepsda|awk'{print$11}'`echo"向设备发起的I/O服务时间的平均值:"$disk_sda_svctm#向设备发起I/O请求的CPU时间百分比设备disk_sda_util=`iostat-kx|grepsda|awk'{print$12}'`echo"向设备发起I/O请求的CPU时间百分比:"$disk_sda_util执行结果:2.解释原理,知道为什么呢,下面详细解释一下脚本实现的原理1.获取本地要监控的服务器IP地址IP=`ifconfig|grepinet|grep-vE'inet6|127.0.0.1'|awk'{print$2}'`echo"IP地址:"$IPifconfig|grepinet过滤掉如下结果中包含字符串inet的行,如下图红圈两行所示,其中|是pipeline的意思,将前面命令的结果作为|的输入右边的命令grep-vE'inet6|127.0.0.1'使用命令grep-vE从第一步的结果中过滤掉包含inet6和127.0.0.1的行。使用命令awk拆分第二步结果的字符串。$n(0~N)对应相应的参数,如下图$2对应地址是多少:192.168.0.125,**'{print2}'**打印出2的值并将结果赋值给第三步对变量IPecho"IPaddress:"$IP打印出变量IP的值,【以下脚本中赋值和打印语句的作用相同,不再重复说明】2.获取CPU核心总数cpu_num=`grep-c"modelname"/proc/cpuinfo`echo"totalnumberofcpucores:"$cpu_numinlinux系统的/proc目录存放了很多系统资源信息,当系统在运行,而**/proc/cpuinfo**存放了很多系统运行时cpu的重要信息。所有cpu核心信息均由型号名称字符串给出。通过命令**grep-c"modelname"/proc/cpuinfo**可以计算字符串modelname在文件/proc/cpuinfo中出现的次数,就可以得到CPU的总核数。-c表示统计字符串出现的次数。如下图:3.获取CPU利用率top命令经常被用来监控Linux的系统状态。是一种常用的性能分析工具,可以实时显示系统中各个进程的资源使用情况。#获取用户空间CPU占用百分比cpu_user=`top-b-n1|grepCpu|awk'{print$2}'|cut-f1-d"%"`echo"用户空间CPU占用百分比:"$cpu_user#获取内核空间CPU占用百分比获取空闲CPU百分比cpu_idle=`top-b-n1|grepCpu|awk'{print$8}'|cut-f1-d"%"`echo"空闲CPU百分比:"$cpu_idle#获取等待输入输出占CPUpercentagecpu_iowait=`top-b-n1|grepCpu|awk'{print$10}'|cut-f1-d"%"`echo"等待输入输出占CPU百分比:"$cpu_iowaittoptop-b-n1显示系统信息并按格式打印,结果只刷新一次。n设置退出前的屏幕刷新次数b将顶部输出排列成适合输出到文件的格式。您可以使用此选项创建进程日志grepCpu以提取字符串Cpu所在的行。awk'{print$2}'对第二步得到的字符串进行拆分,调用print方法打印出**$2**对应的第二个字符串,0.5%us。cut-f1-d"%"表示以%为分隔符,分隔第三步的结果,显示分隔后的第一串缺点,即0.5-d"%"用%字符分隔,-f1显示为:拆分每行的第一段,其他脚本等。其他CPU利用率参数含义如下:#usCPU占用用户空间百分比#syCPU内核空间占用百分比#ni用户进程空间优先级改变的进程占用CPU百分比#ididleCPU百分比#waCPU时间等待输入输出百分比#hi硬件中断#si软件中断4.获取CPU上下文切换和中断次数#获取CPU中断次数cpu_interrupt=`vmstat-n11|sed-n3p|awk'{print$11}'`echo"CPU中断次数:"$cpu_interrupt#获取CPU上下文切换次数cpu_context_switch=`vmstat-n11|sed-n3p|awk'{print$12}'`echo"CPU上下文切换次数:"$cpu_context_switch#获取任务队列(等待进程数inreadystate)cpu_task_length=`vmstat-n11|sed-n3p|awk'{print$1}'`echo"CPUtaskqueuelength:"$cpu_task_lengthvmstat是VirtualMeomoryStatistics(虚拟内存统计)的缩写,可以查看操作系统的虚拟内存、进程、CPUActivities是monito红色的。就是对系统的整体情况进行统计。缺点是不能对某个过程进行深入分析。vmstat-n11每个字段名只显示一次。-n:每个字段名在开头只显示一次。sed-n3p将第一步的结果打印到第3行。参数说明:-n或--quiet或--silent取消自动打印模式空格,只显示脚本处理后的结果。动作说明:p:打印,即打印出选中的一条数据。通常p将使用参数sed-n运行~**awk'{print$1}'`**拆分从步骤2的结果中获得的字符串并打印第一个字符串。vmstat5,getCPUloadinformation#获取CPU从15分钟前到现在的负载平均值:"$cpu_load_15min#获取CPU从5分钟前到现在的负载平均值cpu_load_5min=`uptime|awk'{print$10}'|cut-f1-d','`echo"CPU从5分钟前到现在的负载平均值:"$cpu_load_5min#获取CPU从1分钟前到现在的负载平均值cpu_load_1min=`uptime|awk'{print$9}'|cut-f1-d','`echo"1分钟前到现在CPU的负载平均值:"$cpu_load_1min可以用uptime命令查看多长时间服务器一直在运行,当前有多少用户登录,服务器在过去1分钟、5分钟、15分钟的平均系统负载,系统负载是处于可运行或不可中断状态的平均进程数。可运行的进程要么正在使用CPU,要么正在等待使用CPU。处于不可中断状态的进程正在等待一些I/O访问,比如waitingfor磁盘输入输出。有三个时间间隔的平均值。平均负载的含义取决于系统中的CPU数量。负载为1意味着对于具有单个CPU的系统满载,而具有4个CPU的系统意味着75%的时间。免费。参考前面的脚本分析,**awk'{print$9}'|cut-f1-d','**拆分第一步的结果,得到第九个字符串,然后用','分隔开,得到拆分后的第一个字符串。正常运行时间6。获取内存信息#获取物理内存总量mem_total=`free|grepMem|awk'{print$2}'`echo"物理内存总量:"$mem_total#获取操作系统使用的内存总量mem_sys_used=`免费|grepMem|awk'{print$3}'`echo"使用内存总量(操作系统):"$mem_sys_used#获取操作系统未使用内存总量mem_sys_free=`free|grepMem|awk'{print$4}'`echo"Totalremainingmemory(operatingsystem):"$mem_sys_free#获取应用程序使用的内存总量mem_user_used=`free|sed-n3p|awk'{print$3}'`echo"总量memoryused(application):"$mem_user_used#获取应用未使用内存总量mem_user_free=`free|sed-n3p|awk'{print$4}'`echo"剩余内存总量(application):"$mem_user_free#获取swap分区总量Sizemem_swap_total=`free|grepSwap|awk'{print$2}'`echo"swap分区总大小:"$mem_swap_total#获取已使用swap分区大小mem_swap_used=`free|grepSwap|awk'{print$3}'`echo"已用交换分区大小:"$mem_swap_used#获取剩余交换分区大小mem_swap_free=`free|grepSwap|awk'{print$4}'`echo"剩余交换分区大小:“$mem_swap_freefree命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲内存。grepSwap过滤第一步的结果,只显示包含字符串Swap的行。**awk'{print$4}'**将第二步的结果进行除法,打印出第四个字符串的值。【其他脚本参考前面的分析】7.获取磁盘I/O统计echo"statisticsofthespecifieddevice(/dev/sda)"#每秒对设备的读请求数disk_sda_rs=`iostat-kx|grepsda|awk'{print$4}'`echo"每秒对设备的读请求数:"$disk_sda_rs#每秒对设备的写请求数disk_sda_ws=`iostat-kx|grepsda|awk'{print$5}'`echo"每秒向设备发起的写请求数:"$disk_sda_ws#向设备发起的I/O请求队列的平均长度disk_sda_avgqu_sz=`iostat-kx|grepsda|awk'{print$9}'`echo"向设备发起的I/O请求队列的平均长度"$disk_sda_avgqu_sz#每次向设备发起I/O请求的平均时间AverageI/Orequesttime:"$disk_sda_await#平均的值向设备发起的I/O服务时间disk_sda_svctm=`iostat-kx|grepsda|awk'{print$11}'`echo"向设备发起的I/O服务时间的平均值:"$disk_sda_svctm#百分比CPUtimeforinitiatingI/Orequeststothedevicedisk_sda_util=`iostat-kx|grepsda|awk'{print$12}'`echo"CPUtimeforinitializingI/Orequeststothedevice比例n:"$disk_sda_utiliostat命令用于监控系统输入输出设备和CPU使用情况。它的特点是报告磁盘活动统计信息,还报告CPU使用情况。-k:以千字节每秒而不是块每秒显示状态-x:显示扩展状态**grepsda用于过滤第一步得到的结果,只显示包含字符串sda**的一行。**awk'{print$4}'**拆分第二步的结果,只显示第四个字符串。iostatiostat由RedHatEnterpriseLinuxAS分发。同时iostat也是Sysstat的一部分。所以我们需要安装sysstat。安装sysstat包:sudoapt-getinstallsysstat参考:https://www.toutiao.com/i6754887380399849998/本文转载自微信公众号“一口Linux”,可通过以下二维码关注。转载本文请联系易口Linux公众号。