• 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
  • 相关阅读:
    基于bert-base-chinese的二分类任务
    Python Day15 json和文件操作【初级】
    算法_每日一题(9.7)
    非关系型数据库Redis的安装
    构造函数,原型,实例,类的关系整理
    路由模式和打包优化
    【docker快速部署微服务若依管理系统(RuoYi-Cloud)】
    【LeetCode】41. 缺失的第一个正数
    TiDB 环境与系统配置检查
    程序员的哲学
  • 原文地址:https://blog.csdn.net/ximenjianxue/article/details/127612386