• Linux shell脚本之回顾及实用笔记


    一、前言

    在这里插入图片描述
    我们从事运维的小伙伴,除了自动化运维外,在没有自动化条件下,借助shell脚本/Python脚本来提升运维效率,无疑是一个必选项,当前也可以自建自动化运维平台,我们这里还是以Linux shell脚本为主,来汇总一些常用的运维脚本,对于有基础的同学,也随本文一起回顾下相关知识,温故知新。

    二、shell脚本之数据类型

    2.1、数组遍历

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    现场经常因为,某些文件处于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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    调试过程:

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    改进之后:

    #!/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
       		
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    【MySQL系列】- MySQL自动备份详解
    Python Opencv实践 - 轮廓特征(最小外接圆,椭圆拟合)
    【数字人】6、ER-NeRF | 借助空间分解来实现基于 NeRF 的更高效的数字人生成(ICCV2023)
    windows driver开发和双机调试环境搭建
    Vue3组件通信全解析:利用props、emit、provide/inject跨层级传递数据,expose与ref实现父子组件方法调用
    Python匿名函数lambda(R与Python第五篇)
    桌面、文档、下载等文件夹移动后无法复原或desktop.ini不起作用的修复方法
    蓝桥杯备战15.完全二叉树的权值
    C++哈希
    13年测试老鸟,性能测试内存泄露——案例分析(超细整理)
  • 原文地址:https://blog.csdn.net/ximenjianxue/article/details/127612386