
我们从事运维的小伙伴,除了自动化运维外,在没有自动化条件下,借助shell脚本/Python脚本来提升运维效率,无疑是一个必选项,当前也可以自建自动化运维平台,我们这里还是以Linux shell脚本为主,来汇总一些常用的运维脚本,对于有基础的同学,也随本文一起回顾下相关知识,温故知新。
1)数组定义
如果说变量是存储单个变量的内存空间,那么数组就是多个变量的集合,它存储多个元素在一片连续的内存空间中。在bash中,只支持一维数组,不支持多维数组。Linux Shell 数组用括号来表示,Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。与大部分编程语言类似,数组元素的下标由 0 开始。Shell 数组中可以存放多个值,元素用"空格"符号分割开,通用格式var=(value1 value2… valuen);读取数组元素值的一般格式是:${var[index]};查看变量:${var} 或者 $var 默认取第一个;查看全部值:${var[*]} ${var[@]}
数组定义:数组名=(元素1 元素2 元素3 … 元素n)
指定数组对应下标的元素进行赋值:数组名[下标]=值
指定多个数组元素进行赋值:数组名=([下标1]=值1 [下标2]=值2 … [下标n]=值n)
引用数组对应下标的元素:${数组名[下标]}
遍历数组示例1:For循环
#!/bin/bash
a=(1 2 3 4 5 6)
for((i=0; i<10; i++))
do
echo "a[$i]=${a[$i]}"
#echo "a len: ${#a[*]}" //先使用其获取数组中的元素后使用#获取元素个数,即获取数组长度
done
现场经常因为,某些文件处于deleted状态,导致文件所占空间得不到释放,文件使用率经常触发告警,而之前的脚本只监测了一个挂载点,因此未完全解决该问题,因此,修改脚本,监测全部分区使用率,超过阈值,自动写零那些deleted的文件。
原脚本:
#!/bin/bash
time=$(date "+%Y-%m-%d")
mysql_PID=$(ps -ef | grep mysql.sock | grep -v grep | awk '{ print $2 }')
disk_used=`df -hT|grep sda1|awk '{print $6}'|cut -d '%' -f1`
deleted_fd=(`find /proc/*/fd -ls | grep '(deleted)'|awk '{print $11}'|cut -d '/' -f5`)
if [ $disk_used -gt 90 ];then
echo Now $time Root partion used more than 90%
for i in ${deleted_fd[@]}
do
#echo "/proc/$spms_PID/$i"
cat /proc/$mysql_PID/fd/$i >> /opt/mysql_db_bak/Mysql-Master-$time.log && \
echo > /proc/$mysql_PID/fd/$i
done
fi
调试过程:
disk=(`df -hT|grep -v Use|awk '{print $6}'|cut -d '%' -f1`)
echo ${disk[*]} //输出如下
96 0 0 1 0 8 0
echo ${disk[@]} //输出如下
96 0 0 1 0 8 0
改进之后:
#!/bin/bash
time=$(date "+%Y-%m-%d")
mysql_PID=$(ps -ef | grep mysql.sock | grep -v grep | awk '{ print $2 }')
disk_used=(`df -hT|grep sda1|awk '{print $6}'|cut -d '%' -f1`)
deleted_fd=(`find /proc/*/fd -ls | grep '(deleted)'|awk '{print $11}'|cut -d '/' -f5`)
for i in ${disk_used[*]}
do
if [ $disk_used -gt 90 ];then