经典的运维脚本三步曲

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 无论是应用运维,还是数据库运维,均可以分为“人肉”-“自动化”-“智能化”阶段,其中自动化阶段,主要是将一些人做的操作,尤其是一些重复性操作,封装为程序,一方面避免重复性操作,另一方面提高执行效率。

无论是应用运维,还是数据库运维,均可以分为“人肉”-“自动化”-“智能化”阶段,其中自动化阶段,主要是将一些人做的操作,尤其是一些重复性操作,封装为程序,一方面避免重复性操作,另一方面提高执行效率。自动化实现的过程中,经常使用的,可能就是shell脚本了,前段时间,从一个微信公众号,学习了赵班长写的一篇小文,循序渐进的方式,介绍了shell运维脚本的编写,小脚本有大智慧,几十行代码,夹杂着系统设计、代码规范等细节,值得学习。


以下脚本参考的原文:《如何不耍流氓的做运维之-SHELL脚本》,用shell脚本模拟mysql备份过程,循序渐进的三个脚本。


脚本一:记录日志的shell脚本,shell_template_1.sh


#!/bin/bash

SHELL_NAME="shell_template_1.sh"
SHELL_DIR="/home/oracle/scripts/shell"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"

shell_log() {
        LOG_INFO=$1
        echo "$(date "+%Y-%m-%d") $(date "+%H-%M-%S") : ${SHELL_NAME} : ${LOG_INFO}" >> ${SHELL_LOG}
}

shell_log "shell beginning, write log test"
shell_log "sehll success, write log test"


负责打印日志的函数,shell_log(),接受第一个参数,作为需要打印的日志内容,shell_log()中定义了日志输出的格式(年-月-日 时-分-秒 : 脚本名称 : 日志内容),日志文件路径,则由$SHELL_LOG变量定义。


执行shell_template_1.sh,生成日志文件shell_template_1.sh.log,

vi shell_template_1.sh.log

2017-10-11 11-34-39 : shell_template_1.sh : shell beginning, write log test
2017-10-11 11-34-39 : shell_template_1.sh : sehll success, write log test




脚本二:直接执行的脚本很危险,要提示用户如何使用脚本,shell_template_2.sh


#!/bin/bash

SHELL_NAME="shell_template_2.sh"
SHELL_DIR="/home/oracle/scripts/shell"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"

shell_log() {
        LOG_INFO=$1
        echo "$(date "+%Y-%m-%d") $(date "+%H-%M-%S") : ${SHELL_NAME} : ${LOG_INFO}" >> ${SHELL_LOG}
}

shell_usage() {
        echo $"USAGE: $0 {backup}"
}

mysql_backup() {
        shell_log "mysql backup start"
        shell_log "mysql backup stop"
}

main() {
        case $1 in
                backup)
                        mysql_backup
                        ;;
                *)

                        shell_usage;
        esac
}

main $1


shell_template_2.sh相比shell_template_1.sh,增加了如下,

1. shell_usage()函数,用于说明脚本使用方法,即“shell_template_2.sh 跟着backup参数”。

2. 主函数中则判断,若参数是backup,则执行mysql_backup(),否则执行shell_usage()函数,提示用户正确的使用方法。


错误的执行,

sh shell_template_2.sh
USAGE: shell_template_2.sh {backup}


正确的执行,

sh shell_template_2.sh backup


日志显示,

vi shell_template_2.sh.log
2017-10-11 11-35-37 : shell_template_2.sh : mysql backup start
2017-10-11 11-35-37 : shell_template_2.sh : mysql backup stop




脚本三:避免多人同时执行脚本,需要增加锁机制,shell_template_3.sh


!/bin/bash

SHELL_NAME="shell_template_3.sh"
SHELL_DIR="/home/oracle/scripts/shell"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
LOCK_FILE="/home/oracle/scripts/shell/${SHELL_NAME}.lock"

shell_log() {
        LOG_INFO=$1
        echo "$(date "+%Y-%m-%d") $(date "+%H-%M-%S") : ${SHELL_NAME} : ${LOG_INFO}" >> ${SHELL_LOG}
}

shell_usage() {
        echo $"USAGE: $0 {backup}"
}

shell_lock() {
        touch ${LOCK_FILE}

}


shell_unlock() {
        rm -f ${LOCK_FILE}
}

mysql_backup() {
        if [ -f "${LOCK_FILE}" ]; then
                shell_log "${SHELL_NAME} is running"
                echo "${SHELL_NAME}" is running && exit
        fi
        shell_log "mysql backup start"
        shell_lock
        sleep 10
        shell_log "mysql backup stop"
        shell_unlock
}

main() {
        case $1 in
                backup)
                        mysql_backup
                        ;;
                *)
                        shell_usage;
        esac
}


main $1


shell_template_3.sh相比shell_template_2.sh,增加了如下,

1. 增加shell_lock()函数,用于touch一个文件,作为文件锁。

2. 增加shell_unlock()函数,用于删除1创建的锁文件。

3. mysql_backup()函数需要判断是否存在LOCK_FILE,若存在说明有用户正执行,此时提示信息,并退出程序,若不存在文件LOCK_FILE,则执行shell_lock创建锁文件,sleep 10秒,模拟执行,结束前执行shell_unlock,删除锁文件完成,此时其他用户可以执行。


用户A执行脚本,

sh shell_template_3.sh backup

sleep 10秒


用户B在10秒内,执行脚本,提示报错信息,并退出执行,

sh shell_template_3.sh backup;
shell_template_3.sh is running


日志显示,

vi shell_template_3.sh.log

2017-10-11 11-42-03 : shell_template_3.sh : mysql backup start  --用户A记录

2017-10-11 11-42-08 : shell_template_3.sh : shell_template.sh is running  --用户B记录

2017-10-11 11-42-13 : shell_template_3.sh : mysql backup stop  --用户A记录


如果再做规范些,可以加上注释,

######################################################
# $Name:        shell_template.sh
# $Version:     v1.0
# $Function:    Backup MySQL Databaes Template Script
# $Author:      Bisal
# $Create Date: 2017-10-11
# $Description: shell
######################################################




总结:

通过以上三个脚本,经历了“日志记录输出” -> “增加脚本执行的方法说明,并通过传递参数,避免直接执行脚本的风险” -> “利用文件锁,增加了锁机制,避免多人同时执行脚本,带来的可能风险”,这三个阶段,再加上注释,逐步完善,我们可以从中,汲取一些经验,

1. 编写shell经常是面向过程的,但用函数封装,可以让脚本清晰可读。

2. 通过文件锁机制,可以控制并发,其实这还有优化空间,有些场景应该允许用户并发,例如可以通过临时文件写入、合并操作的方法,实现用户并发。

3. 标准常量定义、清晰的注释、函数和变量大小写用法,细节中可以看出严谨,即使只有几行,也能体现出,一名优秀工程师的素质。


虽然离这些目标还有距离,但通过这些优秀的脚本,吸取经验,增长见识,我们会朝着目标前进,兄弟们加油!


如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5月前
|
运维 Shell
运维(15)-shell脚本的调试方法
运维(15)-shell脚本的调试方法
36 0
|
7月前
|
缓存 运维 Linux
Linux(CentOS)运维脚本工具集合
Linux(CentOS)运维脚本工具集合
146 2
|
23天前
|
运维 监控 Linux
linux脚本自动化运维任务
Linux自动化运维通过脚本提升效率,涵盖服务管理(启停服务、异常恢复)、系统监控(资源警报)、日志管理(清理分析)、备份恢复、补丁更新、自动化部署(如Ansible)、网络管理、定时任务(cron)和故障排查。结合shell、Python及工具,形成高效运维体系。
20 3
|
4月前
|
Linux Shell 索引
Python自动化脚本-运维人员宝典第一章 Python脚本概述
在学习本书前,你应该了解一些 Python 编程的基础知识,比如基础语法、变量类型、元组数据类型、列表字典、函数、字符串和方法。在python.org/downloads/上有3.7.2和2.7.15两个版本可供下载。本书中我们将使用3.7这一版本来作为代表示例和包的安装。
235 11
|
7月前
|
运维 关系型数据库 MySQL
Linux实用运维脚本分享
Linux实用运维脚本分享
|
3月前
|
运维 Linux 网络安全
利用群晖NAS+shell脚本实现运维命令执行结果文件自动上传
利用群晖NAS+shell脚本实现运维命令执行结果文件自动上传
122 0
|
4月前
|
缓存 运维 Linux
自动化运维脚本集合
自动化运维脚本集合
60 0
|
5月前
|
存储 运维 Linux
由一个自动化脚本运维展开的思考
读完善的readme,要比看代码硬啃功能更好。 借用完善的cmake,要比自己编译再去解决库依赖好。 Makefile写好之后,make 系列指令,要比自己一个模块一个模块的cp 程序更好。
30 0
|
5月前
|
机器学习/深度学习 运维 Shell
运维(22)- shell开机自启动脚本
运维(22)- shell开机自启动脚本
57 1
|
5月前
|
运维 Shell C语言
运维(03)- shell执行脚本
运维(03)- shell执行脚本
22 0