前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Shell编程-案例(一)

Shell编程-案例(一)

作者头像
运维小路
发布2024-11-01 19:59:09
发布2024-11-01 19:59:09
800
举报
文章被收录于专栏:运维小路

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们前面学习了那么多命令,以及涉及到部分逻辑判断的问题。从简单来说,他就是Shell编程,只有由于命令比较单一,只能实现比较简单的功能。如果我们把多个操作都放到一起去,并添加更复杂的逻辑在里面,他就是Shell编程。所以我们主要从以下几个方面讲解Shell编程:

Shell编程-什么是shell

Shell编程-变量

Shell编程-数据类型

Shell编程-逻辑判断

Shell编程-if判断

Shell编程-if和else

Shell编程-while循环

Shell编程-for循环

Shell编程-case

Shell编程-break

Shell编程-continue

Shell编程--函数

Shell编程-案例(一)(本章节)

Shell编程-案例(二)

Shell编程-小结

通过前面多个小节的讲解,我们的Shell编程的基本功能都已经讲完了,后面两小节将通过4个案例来讲解Shell的实际用途。

备份MySQL数据库

在我们日常运维中,定期备份数据库,是一个很好的习惯。我们就以此为需求,来书写我们的备份脚本。

代码语言:javascript
复制
#!/bin/bash

# 设置备份目录
BACKUP_DIR="/home/backup"

# 获取当前日期
DATE=$(date +%Y-%m-%d)

# 检查备份目录是否存在,如果存在则退出
if [ -d "$BACKUP_DIR/$DATE" ]; then
    echo "备份目录已存在,放弃此次备份。"
    exit 0
fi

# 创建当天的备份目录
mkdir -p "$BACKUP_DIR/$DATE"
# 获取所有数据库列表
DATABASES=$(mysql -uroot  -e "SHOW DATABASES;" | tr -d "| " | grep -v Database)

# 遍历每个数据库进行备份
for DATABASE in $DATABASES; do
    echo "正在备份数据库:$DATABASE"
    mysqldump -uroot  $DATABASE > "$BACKUP_DIR/$DATE/${DATABASE}_${DATE}.sql"
done

echo "备份完成。"

脚本解释

  1. 定义了2个变量,定义了备份存储路径和备份时间
  2. 为了避免一天备份多次,所以这里添加了一个if判断,如果备份目录存在,则放弃备份,避免重复备份。
  3. 备份前先创建备份存储目录。
  4. 然后通过mysql命令获取需要备份的数据库列表。
  5. 然后使用for循环把刚才获取的数据库列表依次进行循环备份,并存储在对应的目录里面。
  6. 最后打印一个完成,该脚本可以手工执行,也可以添加任务计划进行自动备份。

注:这个备份脚本是把mysql的密码写入了本地配置的,所以没有密码选项。

检查运行的服务

我们的Linux服务器需要运行服务,但是如果服务中途出现异常异常以后,怎么把它自动拉起呢?我们今天这个脚本就以zookeeper这个服务来为作为需要监测的对象。

代码语言:javascript
复制
#!/bin/bash

# Zookeeper 服务地址和端口
ZK_SERVER="localhost 2181"

# 日志文件路径
LOG_FILE="/tmp/zookeeper_check.log"

# 检查 Zookeeper 状态
echo "Checking Zookeeper status..."
status=$(echo ruok | nc $ZK_SERVER | grep -i imok)

current_time=$(date +"%Y-%m-%d %H:%M:%S")
if [ -n "$status" ]; then
    echo "[$current_time] Zookeeper is running properly." | tee -a $LOG_FILE
else
    echo "[$current_time] Zookeeper is not running or in an abnormal state. Attempting to restart..." | tee -a $LOG_FILE
    # 重启 Zookeeper 的命令,根据实际情况修改
    /home/apache-zookeeper-3.8.4-bin/bin/zkServer.sh start
    if [ $? -eq 0 ]; then
        echo "[$current_time] Zookeeper restarted successfully." | tee -a $LOG_FILE
    else
        echo "[$current_time] Failed to restart Zookeeper." | tee -a $LOG_FILE
    fi
fi

脚本解释

1.还是首先定义了2个变量,一个是需要检查的zk地址,另外一个是检查日志输出路径。

2.通过zookeeper的四字命令,检查zk的状态,然后把这个zk的状态值传给一个变量。

3.再次定义了一个当前时间的变量,用于后面输出到日志里面打印时间。

4.通过一个if判断,判断zk的状态是否满足预期,如果满足预期,则说明zk是正在运行中,并将日志输出到日志里面

5.如果不满足预期,则说明zk未运行,就执行启动zk服务。

6.再次判断启动启动命令的执行情况,无论结果如何都输出到日志里面。

总结

  1. 这些脚本都是还有优化空间的,比如mysql备份如果备份了怎么办,也没有输出日志,都不知道备份情况。
  2. 在zookeeper的四字命令里面,其实用stat也可以,但是这个命令在高负载的情况下可能会失败,用auok是没问题的。
  3. 在Linux里面其实实现同一个功能,实际上是有不同的实现方法的。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档