日常开发中,需要完成一些运维工作,需要编写Shell脚本提升自动化能力,提高效率。
1、文件批量重命名
案例描述:将指定目录下的所有.txt
文件扩展名改为.yml
。
#!/bin/bash
# 批量重命名文件扩展名
directory=$1
for file in $directory/*.txt; do mv "$file" "${file%.txt}.yml"
done
echo "当前目录下所有.txt文件已重命名为.yml"
使用方式:
./rename_files.sh /renamepath/to/directory
2、备份数据库
案例描述:每天凌晨自动备份MySQL数据库到指定目录。
#!/bin/bash
# 自动备份MySQL数据库
backup_dir="/backup/data/mysql"
db_user="root"
db_password="password"
db_name="mydatabase"
date_str=$(date +%Y%m%d%H%M%S)
backup_file="$backup_dir/$db_name-$date_str.sql"
mysqldump -u$db_user -p$db_password $db_name > $backup_file
echo "当前数据库$db_name已备份到$backup_file"
使用方式:
在crontab -e中添加:0 0 * * * /path/to/backup_db.sh
3、查找并删除大文件
案例描述:查找并删除指定目录下大于100MB的文件。
#!/bin/bash
# 查找并删除大文件
directory=$1size_threshold=$((100 * 1024 * 1024))
# 100MB in bytes
find $directory -type f -size +$size_threshold -exec rm -f {} \;
echo "已删除$directory目录下所有大于100MB的文件"
使用方法:
./delete_large_files.sh /path/to/directory
4、清理临时文件
案例描述:每天清理指定目录下的临时文件。
#!/bin/bash
# 清理临时文件
temp_dir="/tmp"
# 删除超过7天的临时文件
find $temp_dir -type f -mtime +7 -exec rm -f {} \;
echo "已清理$temp_dir目录下超过7天的临时文件"
使用方式:
在crontab -e中添加:0 0 * * * /path/to/cleanup_temp.sh
5、发送系统状态报告
案例描述:每天发送系统状态报告(如CPU、内存使用情况)到管理员邮箱。
#!/bin/bash
# 发送系统状态报告
email="service@example.com"
report=$(free -m && df -h && uptime && vmstat 1 5 | tail -n 15)
echo "$report" | mail -s "系统状态报告" $email
使用方式:
在crontab -e中添加:0 12 * * * /path/to/send_system_report.sh(假设每天上午12点发送)
6、检查磁盘空间并发送邮件
案例描述:当磁盘空间低于某个阈值时,发送邮件警告。
#!/bin/bash
# 检查磁盘空间并发送邮件
# 阈值百分比
threshold=80
email="service@example.com"
used=$(df / | grep / | awk '{ print $5}' | sed 's/%//g')
if [ $used -ge $threshold ]; then echo "磁盘空间警告:已使用 $used%" | mail -s "磁盘空间警告" $email
fi
使用方式:
check_disk_threshold.sh
7、检测 MySQL 服务是否存活
案例描述:检查MySQL服务是否存活
#!/bin/bash
# 检测 MySQL 服务是否存活
# host 为你需要检测的 MySQL 主机的 IP 地址,user 为 MySQL 账户名,passwd 为密码
# 这些信息需要根据实际情况修改后方可使用
host=XXX
user=XXX
passwd=XXX
mysqladmin -h '$host' -u '$user' -p'$passwd' ping &>/dev/null
if [ $? -eq 0 ]
thenecho "MySQL is UP"
elseecho "MySQL is down"
fi
8、Nginx访问日志自动按天(周、月)切割
#!/bin/bash
#nginx日志目录
LOG_DIR=/www/server/nginx/logs
#获取到上一天的时间
YESTERDAY_TIME=$(date -d "yesterday" +%F)
#归档日志取时间
LOG_MONTH_DIR=$LOG_DIR/$(date +"%Y-%m")
#归档日志的名称
LOG_FILE_LIST="access.log"
for LOG_FILE in $LOG_FILE_LIST; do[ ! -d $LOG_MONTH_DIR ] && mkdir -p $LOG_MONTH_DIRmv $LOG_DIR/$LOG_FILE $LOG_MONTH_DIR/${LOG_FILE}_${YESTERDAY_TIME}
done
kill -USR1 $(cat $LOG_DIR/nginx.pid)
9、监控MySQL主从同步状态是否异常脚本
#!/bin/bash
HOST=XX
USER=XX
PASSWD=XX
IO_SQL_STATUS=$(mysql -h$HOST -u$USER -p$PASSWD -e 'show slave status\G'
2>/dev/null |awk '/Slave_.*_Running:/{print $1$2}')
for i in $IO_SQL_STATUS; doTHREAD_STATUS_NAME=${i%:*}THREAD_STATUS=${i#*:}if [ "$THREAD_STATUS" != "Yes" ]; thenecho "Error: MySQL Master-Slave $THREAD_STATUS_NAME status is
$THREAD_STATUS!" |mail -s "Master-Slave Staus" xxx@163.comfi
done