系统维护shell脚本开发过程

系统维护shell脚本开发过程
日期:2012-09-28

说明:
root @python :/# cat /etc/issue
Ubuntu 10.10
root @python :/# uptime
10:26:13 up 16 days, 22 min,  1 user,  load average: 0.00, 0.01, 0.00
#通过此命令可了解系统基本负载情况,
#获取最近1分钟负载
 root@python :/# uptime |cut -d, -f4
   load average: 0.03
 root@python :/# uptime |cut -d, -f4 |cut -d: -f2
  0.03
 root@python :/# uptime |cut -d, -f4 |cut -d: -f2 |sed 's/ //g'  #【# sed去除空格】
 0.02

#将获取数值赋给变量

#方法一
 root@python :/# load_1min=`uptime |cut -d, -f4 |cut -d: -f2 |sed 's/ //g'`
 root@python :/# echo ${load_1min}
 0.09
 #方法二
 root@python :/# echo $(uptime |cut -d, -f4 |cut -d: -f2 |sed 's/ //g')
 0.06

#因上面获取负载值与系统cpu core在较大关系,特别在多cpu系统中,此值需与cpu核数比较,才可大概清楚系统cpu负载情况 【具体原因,baidu】

#获取系统识别cpu核数  操作过程与上面会获取 load相同,通过命令行组合
#方法1
 root @python :/# mpstat
 Linux 2.6.35-22-generic-pae (python)    09/28/2012      _i686_  (2 CPU)

 10:37:12 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
 10:37:12 AM  all    0.12    0.00    0.14    0.08    0.00    0.01    0.00    0.00   99.65
 root @python :/# mpstat |head -1
 Linux 2.6.35-22-generic-pae (python)    09/28/2012      _i686_  (2 CPU)
 root @python :/# mpstat |head -1 |cut -d"(" -f3 
 2 CPU)
 root @python :/# mpstat |head -1 |cut -d"(" -f3 |awk '{print $1}'
 2

#方法二

 root @python :/# iostat | head -1 |cut -d"(" -f3 |awk '{print $1}' 
 2
 #方法三
 root @python :/# cat /proc/cpuinfo |grep process
 processor       : 0
 processor       : 1
 root @python :/# cat /proc/cpuinfo |grep process |wc -l
 2

#比较,判断系统负载是否过高

 root@python :/# if [ $(`uptime |cut -d, -f4 |cut -d: -f2 |sed 's/ //g'`) -ge $(cat /proc/cpuinfo |grep process |wc -l) ];then
 > echo "HIGH"
 > else
 > echo "OK"
 > fi
 0.02: command not found
 -su: [: -ge: unary operator expected
 LOAD OK

#如上,程序出现报错,语法并没有错误,原因为bash shell if 比较中,不支持浮点数

#碰到浮点数操作,解决此问题方法,可通过使用awk 。。。。等解决
 root@python :/# echo "$(uptime |cut -d, -f4 |cut -d: -f2 |sed 's/ //g') $(cat /proc/cpuinfo |grep process |wc -l)" | awk 'END{if($1 >= $2) {print "HIGH";}else{print "OK";}}'

 OK

#如上,直接输出OK与high提示,程序并没有太大价值,可以增加时间点输出,并记录日志,则通过看日志,可了解记录时间内的情况

 root @python :/# date +"%Y-%m-%d_%T"
 2012-09-28_11:02:58
 root @python :/# echo $(uptime |cut -d, -f4 |cut -d: -f2 |sed 's/ //g') $(cat /proc/cpuinfo |grep process |wc -l) $(date +"%Y-%m-%d_%T") | awk 'END{if($1 >= $2) {printf("[%s] HIGH\n",$3);}else{printf("[%s] OK\n",$3);}}'

 [2012-09-28_11:02:59] OK

#再将程序进行组合,不间断获取每10秒钟情况

 root@python :/# while [ true ]
 > do
 > echo $(uptime |cut -d, -f4 |cut -d: -f2 |sed 's/ //g') $(cat /proc/cpuinfo |grep process |wc -l) $(date +"%Y-%m-%d_%T") | awk 'END{if($1 >= $2) {printf("[%s] HIGH\n",$3);}else{printf("[%s] OK\n",$3);}}'
 > sleep 10
 > done
 [2012-09-28_11:04:53] OK
 [2012-09-28_11:05:03] OK
 [2012-09-28_11:05:13] OK
 [2012-09-28_11:05:23] OK
 ^C

#如上,命令行代码已是具备一定功能的shell脚本,将其保存文件,则就是一个shell脚本 

#!/bin/bash -f
#program file name: sys_load.sh
while [ true ]
do
echo $(uptime |cut -d, -f4 |cut -d: -f2 |sed 's/ //g') $(cat /proc/cpuinfo |grep process |wc -l) $(date +"%Y-%m-%d_%T") | awk 'END{if($1 >= $2) {printf("[%s] HIGH\n",$3);}else{printf("[%s] OK\n",$3);}}'
sleep 10
done


# 将程序保存名称为 sys_load.sh
 root @python :/tmp# ls
 sys_load.sh
 root @python :/tmp# chmod u+x sys_load.sh   #程序赋予可执行权限
 root @python :/tmp# ./sys_load.sh   #执行
 [2012-09-28_11:09:02] OK
 [2012-09-28_11:09:12] OK

#记录执行输出日志

root @python :/tmp# ./sys_load.sh  > /tmp/test.log
^C
root @python :/tmp# cat /tmp/test.log
[2012-09-28_11:10:19] OK
上面就是一个系统运维脚本的编写全过程,在实际环境中,考虑后续维护问题,建议给代码注释,代码编写更直观一些,需要考虑易阅问题
一点经验: 将上面获取数据的一行代码,分成多行,并用相应变量替代,会让程序更变得易阅读一些
参考变化如下:
#!/bin/bash -f
#program file name: sys_load.sh
while [ true ]
do
load_1min=$(uptime |cut -d, -f4 |cut -d: -f2 |sed 's/ //g')
cpu_core=$(cat /proc/cpuinfo |grep process |wc -l)
datetime=$(date +"%Y-%m-%d_%T")

echo "${load_1min} ${cpu_core} ${datetime}" | awk 'END{if($1 >= $2) {printf("[%s] HIGH\n",$3);}else{printf("[%s] OK\n",$3);}}'
sleep 10
done


你可能感兴趣的:(shell,bash,awk)