以系统监控为例详解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、多重管道的使用