shell脚本学习——实战案例

一、监控一个主机的存活状态

方案1

[root@localhost AnLi]# sh ping.sh 192.168.3.222
192.168.3.222 is up
[root@localhost AnLi]# sh ping.sh 192.168.3.223
192.168.3.223 is down
[root@localhost AnLi]# cat ping.sh
#!/bin/bash
# **********************************************************
# * Author        : JiangLinlong
# * Create time   : 2022-02-26 15:50
# * Filename      : ping.sh
# * Description   :
# **********************************************************
#监控目标主机状态
#监控方式 ping ICMP协议
#ping 通 host up
#ping不通 host down
#ping的取值  报警阀值  3次去不失败  报警机器down
for ((i=1;i<4;i++));do
  if ping -c1 $1 &>/dev/null;then
    export ping_count"$i"=1
  else
    export ping_count"$i"=0
  fi
 sleep 1
done
#3次失败则报警
if [ $ping_count1 -eq 0 ] && [ $ping_count2 -eq 0 ] && [ $ping_count3 -eq 0 ] ; then
  echo "$1 is down"
else
  echo "$1 is up"
fi
unset ping_count1
unset ping_count2
unset ping_count3

方案二

[root@localhost AnLi]# sh host_ping.sh 192.168.3.222
192.168.3.222 is up
[root@localhost AnLi]# sh host_ping.sh 192.168.3.223
192.168.3.223 is down
[root@localhost AnLi]# cat host_ping.sh
#!/bin/bash
# **********************************************************
# * Author        : JiangLinlong
# * Create time   : 2022-02-26 16:34
# * Filename      : host_ping.sh
# * Description   :
# **********************************************************
#监控目标主机状态
#监控方式 ping ICMP协议
#ping 通 host up
#ping不通 host down
#ping的取值  报警阀值  如果包丢失率不是0%  报警机器down
status=`ping -c 3 -i 2 $1 | grep loss| awk -F "," '{print $3}'|awk '{print $1}'`
if [ $status == "0%" ]; then
   echo "$1 is up"
else
   echo "$1 is down"
fi

二、监控一个端口存活状态 等价于监控系统服务

[root@localhost AnLi]# sh check_host.sh 192.168.88.133 22
192.168.88.133 22 is open
[root@localhost AnLi]# sh check_host.sh 192.168.88.133 29
192.168.88.133 29 is close
[root@localhost AnLi]# cat check_host.sh
#!/bin/bash
# **********************************************************
# * Author        : JiangLinlong
# * Create time   : 2022-02-27 15:16
# * Filename      : check_host.sh
# * Description   :
# **********************************************************
#监控方法
#1) 通过systemctl service 服务启动状态
#2)lsof 查看端口欧是否存在
#3)查看进程是否存在
####压力过大  无法响应  |  服务down了 上述东西还存在
#4)测试端口是否有响应  推荐
#telnet 协议
#main
port_status () {
#创建一个临时文件用来存放telnet输出的内容
temp_file=`mktemp port_status.XXX`
#1 判断依赖命令Telnet是否存在
#if的简写
[ ! -x /usr/bin/telnet ] && echo "telnet:not found command" && exit 1
#2、测试端口 $1 ip  $2 port
( telnet $1 $2 <<EOF
quit
EOF
) &>$temp_file
if egrep "\^]" $temp_file &>/dev/null;then
   echo "$1 $2 is open"
else
   echo "$1 $2 is close"
fi
rm -f $temp_file
}
port_status $1 $2

三、监控内存使用率

[root@localhost AnLi]# sh memory_use.sh
memory_userd: 52.3173%
memory_cached: 30.4571%
memory_buffer: 0.2117%
[root@localhost AnLi]# cat memory_use.sh
#!/bin/bash
# **********************************************************
# * Author        : JiangLinlong
# * Create time   : 2022-02-27 15:53
# * Filename      : memory_use.sh
# * Description   :
# **********************************************************
#内存使用率统计脚本
#/proc/meminfo
#内存使用顺序  free——cache——buffer——swap
memory_user() {
memory_userd=`head -2 /proc/meminfo |awk NR==1'{t=$2}NR==2{f=$2;print(t-f)*100/t"%"}'`
memory_cache=`head -10 /proc/meminfo |awk NR==1'{t=$2}NR==5{c=$2;print c/t*100"%"}'`
memory_buffer=`head -10 /proc/meminfo |awk NR==1'{t=$2}NR==4{b=$2;print b/t*100"%"}'`
echo "memory_userd: $memory_userd"
echo "memory_cached: $memory_cache"
echo "memory_buffer: $memory_buffer"
}
memory_user

四、监控使用CPU或者内存前10名进程

[root@localhost AnLi]# sh memory_use_top10.sh
memory
29516 firewalld
28652 sshd
19684 httpd
17444 tuned
11980 polkitd
11332 NetworkManager
6692 systemd
6400 vmtoolsd
6272 bash
6076 VGAuthService
cpu
99.9 bash
6.2 sshd
0 xfs-reclaim/sda
0 xfs-reclaim/dm-
0 xfs_mru_cache
0 xfs-log/sda1
0 xfs-log/dm-0
0 xfs-eofblocks/s
0 xfs-eofblocks/d
0 xfs-data/sda1
[root@localhost AnLi]# cat memory_use_top10.sh
#!/bin/bash
# **********************************************************
# * Author        : JiangLinlong
# * Create time   : 2022-02-27 16:26
# * Filename      : memory_use_top10.sh
# * Description   :
# **********************************************************
#统计系统中前十名使用内存最多的进程
memory() {
  #收集任务管理器进程信息
  temp_file=`mktemp memory.XXX`
  top -b -n1 | tail -n +8 > $temp_file
  awk '{array[$NF]+=$6}END{for (i in array) print array[i],i}' $temp_file |sort -k 1 -n -r |head -10
  rm -rf $temp_file
}
cpu() {
  #收集任务管理器进程信息
  temp_file=`mktemp memory.XXX`
  top -b -n1 | tail -n +8 > $temp_file
  awk '{array[$NF]+=$9}END{for (i in array) print array[i],i}' $temp_file |sort -k 1 -n -r |head -10
  rm -rf $temp_file
}
echo memory
memory
echo cpu
cpu

五、监控磁盘IO使用情况(iostat)

1、监控目的:随时掌握IO的使用情况,防止性能瓶颈
2、监控指标:IO队列长度、IOPS、磁盘吞吐量
3、监控命令:

iostat (sysstat包提供),本节重点讲解
iozone(三方提供)
iostat语法
用法:iostat [选型] [<时间间隔>[<次数>]]
常用选项说明
-c :只显示系统CPU统计信息,即单独输出avg-cpu结果,不包括device结果
-d :单独输出device结果,不包括cpu结果
-k /m:输出结果以kb/mb为单位,而不是以扇区为单位
-x :输出更详细的IO设备统计信息
interval/count:每次输出间隔时间,count表示输出次数,不带count表示循环输出

iostat,结果为从系统开机到当前执行时刻的统计信息
输出含义:
avg-cpu:总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值。重点关注iowait值,表示CPU用于等待io请求的完成时间。
%user: CPU处在用户模式下的时间百分比。
%nice: CPU处在带NICE值的用户模式下的时间百分比。%system: CPU处在系统模式下的时间百分比。
%iowait : CPU等待输入输出完成时间的百分比。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle: CPU空闲时间百分比。

Device:各磁盘设备的IO统计信息。各列含义如下:
Device:以sdx形式显示的设备名称
tps:每秒进程下发的io读写请求数量
KB_read/s:每秒从驱动器读入的数量,单位为K
KB_wrth/s:每秒从驱动器写入的数量,单位为K
KB_read:读入数据总量,单位为K
KB_wrth:写入数据总量,单位为K

[root@localhost AnLi]# iostat -x
Linux 3.10.0-1062.el7.x86_64 (localhost.localdomain)    02/27/2022      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.09    0.00    0.23    0.01    0.00   99.68

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.02    0.11    0.16     4.35     3.63    59.40     0.00    1.30    0.83    1.64   0.55   0.01
scd0              0.00     0.00    0.00    0.00     0.02     0.00   114.22     0.00    1.94    1.94    0.00   1.39   0.00
dm-0              0.00     0.00    0.09    0.18     4.12     3.60    57.57     0.00    1.51    0.98    1.78   0.54   0.01
dm-1              0.00     0.00    0.00    0.00     0.04     0.00    50.09     0.00    0.14    0.14    0.00   0.11   0.00

以.上各列的含义如下:
rrqm/s:每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s:每秒对该设备的写请求被合并次数
r/s:每秒完成的读次数
w/s:每秒完成的写次数
rkB/s:每秒读数据量(kB为单位)
wkB/s:每秒写数据量(kB为单位)
avgrq-sz:平均每次IO操作的数据量(扇区数为单位)
avgqu-sz:平均等待处理的IO请求队列长度
await:平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
svctm:平均每次IO请求的处理时间(毫秒为单位)
%util:采用周期内用于IO操作的时间比率,即IO队列非空的时间比率

[root@localhost AnLi]# cat io_status.sh
#!/bin/bash
# **********************************************************
# * Author        : JiangLinlong
# * Create time   : 2022-02-27 18:05
# * Filename      : io_status.sh
# * Description   :
# **********************************************************

#磁盘io监控  明确知晓HD的使用量情况
#监控指标  IO队列长度  IOPS 吞吐量
#   iostat iozone

#iostat 队列长度  明确反馈IO是否忙
#iostat  由sysstat

#iostat 命令

io() {
  device_num=`iostat -x |egrep "^sd[a-z]"|wc -l`
  iostat -x 1 3 | egrep "^sd[a-z]"|tail -n +$((device_num+1))|awk '{io_long[$1]+=$9}END{for (i in io_long)print io_long[i],i}'
}

#阈值如何判断  2-3
#循环测试
while true
do
  io
  sleep 5
done
[root@localhost AnLi]# sh io_status.sh
0 sda
0.33 sda

模拟磁盘写入

[root@localhost AnLi]# dd if=/dev/zero of=/tmp/bigfile bs=1M count=3000
3000+0 records in
3000+0 records out
3145728000 bytes (3.1 GB) copied, 9.40534 s, 334 MB/s

六、监控脚本总结

1、明确监控项
2、阈值是多少
3、监控方法(命令、其他方法、思路(运行方法,调用方法))
4、返回值是什么

七、Nginx 安装脚本

脚本全文

#!/bin/bash
# **********************************************************
# * Author        : JiangLinlong
# * Create time   : 2022-03-02 15:35
# * Filename      : nginx_install.sh
# * Description   :
# **********************************************************
#nginx install script from basim
#安装用户  root
#安装前准备  依赖包  源码包获得
#安装
#启动  测试
#variables
nginx_pkg="nginx-1.7.2.tar.gz"
nginx_source_doc=`echo $nginx_pkg|cut -d "." -f1-3`
nginx_install_doc="/usr/local/nginx"
nginx_user="www"
nginx_group="www"
#function
check () {
   #检测当前用户为root
   if [ $USER != 'root' ];then
      echo "need to be root so that "
      exit 1
   fi
   #检查wget命令
   #if简写形式
   #[ ! -x /usr/bin/wget ] && echo "not found command /usr/bin/wget" && exit 1
   if [ ! -x /usr/bin/wget ];then
      echo "not found command /usr/bin/wget"
      exit 1
   fi
}

install_pre () {
#1、安装依赖
#0 stdin 标准输入    1 stdout标准输出   2 stderr 错误输出
if ! (yum -y install gcc-* pcre-devel zlib-devel slinks 1>/dev/null);then
   echo "ERROR: yum install error"
   exit 1
fi
#2、下载源码包
if wget http://nginx.org/download/$nginx_pkg 1>/dev/null;then

   tar xf $nginx_pkg
   if [ ! -d $nginx_source_doc ];then
        echo "ERROR:not found $nginx_source_doc"
        exit 1
   fi
else
   echo "ERROR: wget file $nginx_source_doc fail"
   exit 1
fi
}

install () {
#1、创建管理用户
useradd -r -s /sbin/nologin www
cd $nginx_source_doc
echo "nginx configure......."
if ./configure --prefix=$nginx_install_doc --user=$nginx_user --group=$nginx_group 1>/dev/null;then
   echo "nginx make......"
   if  make 1>/dev/null;then
      echo "nginx install....."
      if make install 1>/dev/null;then
           echo "nginx install success"
      else
           echo "ERROR:nginx make install fail";exit 1
      fi
   else
      echo "ERROR:nginx make fail";exit 1
    fi
else
   echo "ERROR:nginx configure fail";exit 1
fi
}

nginx_test () {
if $nginx_install_doc/sbin/nginx; then
   echo "nginx start SUCCESS"
   elinks http://localhost -dump
else
   echo "nginx stop FAIL"
fi
}
#callable
echo "this is nginx install script"
read -p "press Y install, press C cancel:  " ch
if [ $ch == 'Y' ];then
   check;install_pre;install;nginx_test
elif [ $ch == 'C' ];then
  exit 1
fi

脚本测试结果

[root@localhost AnLi]# sh nginx_install.sh
this is nginx install script
press Y install, press C cancel:  C
[root@localhost AnLi]# sh nginx_install.sh
this is nginx install script
press Y install, press C cancel:  Y
--2022-03-02 17:46:17--  http://nginx.org/download/nginx-1.7.2.tar.gz
Resolving nginx.org (nginx.org)... 52.58.199.22, 3.125.197.172, 2a05:d014:edb:5702::6, ...
Connecting to nginx.org (nginx.org)|52.58.199.22|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 814079 (795K) [application/octet-stream]
Saving to: ‘nginx-1.7.2.tar.gz’

100%[============================================================================================================================================================>] 814,079      398KB/s   in 2.0s

2022-03-02 17:46:20 (398 KB/s) - ‘nginx-1.7.2.tar.gz’ saved [814079/814079]

useradd: user 'www' already exists
nginx configure.......
nginx make......
nginx install.....
nginx install success
nginx start SUCCESS
                               Welcome to nginx!

   If you see this page, the nginx web server is successfully installed and
   working. Further configuration is required.

   For online documentation and support please refer to [1]nginx.org.
   Commercial support is available at [2]nginx.com.

   Thank you for using nginx.

References

   Visible links
   1. http://nginx.org/
   2. http://nginx.com/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XL's妃妃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值