作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们前面学习了那么多命令,以及涉及到部分逻辑判断的问题。从简单来说,他就是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数据库
在我们日常运维中,定期备份数据库,是一个很好的习惯。我们就以此为需求,来书写我们的备份脚本。
#!/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 "备份完成。"
脚本解释
-
定义了2个变量,定义了备份存储路径和备份时间
-
为了避免一天备份多次,所以这里添加了一个if判断,如果备份目录存在,则放弃备份,避免重复备份。
-
备份前先创建备份存储目录。
-
然后通过mysql命令获取需要备份的数据库列表。
-
然后使用for循环把刚才获取的数据库列表依次进行循环备份,并存储在对应的目录里面。
-
最后打印一个完成,该脚本可以手工执行,也可以添加任务计划进行自动备份。
注:这个备份脚本是把mysql的密码写入了本地配置的,所以没有密码选项。
检查运行的服务
我们的Linux服务器需要运行服务,但是如果服务中途出现异常异常以后,怎么把它自动拉起呢?我们今天这个脚本就以zookeeper这个服务来为作为需要监测的对象。
#!/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.再次判断启动启动命令的执行情况,无论结果如何都输出到日志里面。
总结
-
这些脚本都是还有优化空间的,比如mysql备份如果备份了怎么办,也没有输出日志,都不知道备份情况。
-
在zookeeper的四字命令里面,其实用stat也可以,但是这个命令在高负载的情况下可能会失败,用auok是没问题的。
-
在Linux里面其实实现同一个功能,实际上是有不同的实现方法的。
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。