以系统监控为例详解shell脚本的思路问题

以系统监控为例详解shell脚本的思路问题

在shell脚本的编写中,思路极为重要。我们以系统信息和运行状态获取脚本为例做一个思路的详细解析。
在这里插入图片描述

思路解析

不光是shell脚本,在我们做任何事的时候,都要有一个清晰的思路,才能做到不忙不乱。

一、创建脚本

创建脚本是我们做任何操作的前提,先创建出一个空的脚本。

vim system.sh  //创建新的脚本文件

二、理思路

1、目的:查看系统信息和获取运行状态。

目的,即我们编写这个脚本的目的是什么,是为了达成什么样的功能。搞清楚这个才能理清楚方向。

2、手段:用什么工具去帮助达成目的

即我们用什么样的手段去实现我们的目的,很显然,我们是通过shell脚本来实现我们的目的。
其次,我们该使用什么样的工具去实现,是自定义变量?echo?if?while?..
要搞清楚手段和工具就必须要明确我需要实现的功能。

3、步骤:拆解(大方向—小目标----每一步)

我们要实现系统监控,需要监控什么。我把他分成了两大类:
1)系统信息:系统类型、系统版本名称、架构、内核、主机名、内外网IP、DNS、网络连通、登录用户
2)运行状态:CPU负载,内存(系统、应用),磁盘使用率

4、检测

完成基础功能架构后,试运行脚本,检查是否有语法和功能上的问题。

5、完善和优化(格式,颜色,细节)

三、写脚本

#!/bin/bash    //指定解释器
clear          //清屏
if [[ $# -eq 0 ]];then      //提取我有的位置参数的个数,为0往下执行(搭一个基本的框架结构)
#定义变量reset_terminal
reset_terminal=$(tput sgr0) //定义变量恢复端为tput sgr0,等同于\E[0m,清除属性
扩展:shell的tput命令创建交互性的、专业性强的屏幕输出。
      如移动或更改光标、更改文本属性,以及清除终端屏幕的特定区域。
	  (粗体,闪烁,隐藏,清屏,设置宽度,列数目,行数等等等等)
#一、查看系统信息
#查看操作系统类型
   os=$(uname -o)  //定义变量os为uname -o,即查看操作系统类型
   echo -e '\E[32m' "Operating System Type:" $reset_terminal $os
   
#检查操作系统版本和名称(cat /etc/issue | grep -e "Server")注:系统环境不同,采取不同方式(Redhat-release)
   os_name=$(cat /etc/centos-release)
   echo -e '\E[32m' "Check OS Release Version and Name:" $reset_terminal $os_name
   
#查看CPU架构
   architecture=$(uname -m)
   echo -e '\E[32m' "Check Architecture:" $reset_terminal $architecture
   
#查看内核发行版本(延伸:uname -a)
   kernerrelease=$(uname -r)
   echo -e '\E[32m' "Check Kernel Release:" $reset_terminal $kernelrelease
   
#检查主机名(hostname) (echo $HOSTNAME)
   hostname=$(uname -n)
   echo -e '\E[32m' "Check hostname:" $reset_terminal $hostname
   
#查看内网IP(iconfig  ip addr)
   internalip=$(hostname -I)
   echo -e '\E[32m' "Check Internal IP:" $reset_terminal $internalip
   
#查看公网IP(curl -s http://ipecho.net/plain)(curl ifconfig.me)  对端拒绝访问
   echo -e '\E[32m' "Check External IP:" $reset_terminal 
   curl cip.cc
   
#查看DNS(cat /etc/resolv.conf | grep -E "\<nameserver[ ]+" | awk '{print $NF}')
   nameserver=$(cat /etc/resolv.conf | awk 'NR==3{print $2}')
   echo -e '\E[32m' "Check DNS:" $reset_terminal $nameserver
   
#检查网络是否连通(前面相当于已经证明)
   ping -c 2 www.baidu.com &> /dev/null && echo "Internet:连通" || echo "Internet:未连通"
   
#检查已登录用户
    who > /tmp/who
    echo -e '\E[32m' "Logged In Users" $reset_terminal && cat /tmp/who
    rm -f /tmp/who
	
#查看系统内存(free -m)
注:/proc  0字节 存放临时文件信息
    meminfo 内存  动态更新
#查看系统使用内存(awk '/MemTotal/{total=$2}/MemFree/{free=$2}END{print (total-free)/1024}' /proc/meminfo)
    system_mem_usages=$(free -m | awk '/Mem/{print $3}')
    echo -e '\E[32m' "system memuserages" $reset_terminal $system_mem_usages
	
#查看应用程序内存(awk '/MemTotal/{total=$2}/MemFree/{free=$2}/^Cached/{cached=$2}/Buffers/{buffers=$2}END{print (total-free-cached-buffers)/1024}' /proc/meminfo)
    app_mem_usages=$(free -m | awk '/Mem/{total=$2}/Mem/{shared=$5}/Mem/{ba=$6}/Mem/{avail=$7}END{print (total-shared-ba-avail)}')
    echo -e '\E[32m' "apps memuserages" $reset_terminal $app_mem_usages
	
#查看平均负载(-n 1 读一次 -b 更详细)
    loadaverge=$(top -n 1 -b | grep "load average:" | awk '{print $10 $11 $12}')
    echo -e '\E[32m' "load averges" $reset_terminal $loadaverge
	
#查看磁盘使用量(df -h)  -P  行列输出整齐
    diskaverge=$(df -hP | grep -vE 'mapper|tmpfs' | awk '{print $1 " " $5}')
    echo -e '\E[32m' "disk averges" $reset_terminal $diskaverge
fi

四、思考:

1、生产环境中,对于内存的监控主要就是使用内存和程序占用内存。
2、uname命令
3、多种方式实现同一目标
4、环境变量的使用
5、黑洞的使用
6、临时文件的使用
7、多重管道的使用
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值