shell脚本运维开发(持续更新...)
1. 编写批量修改扩展名脚本
要求:找到所有源文件扩产名为 txt 的文件,并将源文件扩产名改成 doc 。
#!/bin/bash
for i in $(ls *.txt);
do
n=${i%.*} # 用取尾的方式去除扩产名
mv $i $n.doc
done
优化:修改任意扩展名
思路:判断参数是否为两个(原扩展名 新扩展名) >> 判断文件是否存在,若不存在,报错加退出脚本 >> 使用 for 循环找到当前目录所有原扩展名的结尾文件 >> 使用 if 判断 mv 命令是否成功,若成功,输出成功,若失败,输出失败
#!/bin/bash
# 检查输入参数是否为两个
if [ $# -ne 2 ]; then
echo "用法: $0 <原扩展名> <新扩展名>"
exit 1
fi
# 提取原扩展名和新扩展名
old_ext=$1
new_ext=$2
# 尝试列出以原扩展名结尾的文件,判断是否存在匹配的文件
ls *."$old_ext" &> /dev/null
if [ $? -ne 0 ]; then
echo "未找到以.$old_ext 结尾的文件。"
exit 0
fi
# 遍历当前目录下所有以原扩展名结尾的文件
for file in *."$old_ext"; do
# 去除原扩展名
base_name=${file%.*}
# 构建新的文件名
new_file=$base_name.$new_ext
# 尝试重命名文件
if mv $file $new_file; then
echo "已将 $file 重命名为 $new_file"
else
echo "重命名 $file 失败"
fi
done
2. 监控服务器磁盘使用率
要求:定期检查服务器硬盘的使用率,当使用率超过某个阈值时,发送警报信息。
#!/bin/bash
# 定义硬盘使用率阈值,单位为百分比
THRESHOLD=80
# 获取根目录(/)的硬盘使用率
USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
# 检查硬盘使用率是否超过阈值
if [ $USAGE -gt $THRESHOLD ]; then
echo "硬盘使用率 $USAGE ,超过阈值80%"
else
echo "硬盘使用率 $USAGE"
fi
3. 批量重启服务器上的服务
要求: 批量重启服务
#!/bin/bash
# 定义服务
SERVICES=("nginx" "php-fpm" "mysql" "redis")
# 重启服务,若没有重启成功,警告
for i in "${SERVICES[@]}"; do
echo "正在重启 $i 服务..."
systemctl restart $i
if [ $? -eq 0 ]; then
echo "$i 服务重启成功"
else
echo "$i 服务重启失败"
journalctl -u $i --no-pager | tail -n 30 > "/var/log/${i}_restart_error.log"
fi
done
journalctl -u SERVICE --no-pager
- 默认情况下,
journalctl
会将输出通过分页器(如less
)显示,以便用户可以逐页查看日志。使用--no-pager
选项后,日志会直接输出到标准输出,而不会使用分页器。for
循环for i in "${SERVICES[@]}"
里,会依次把"nginx"
、"php-fpm"
、"mysql"
和"redis"
赋值给变量i
,这样能确保每个服务名作为一个整体来处理,避免因服务名包含空格等特殊字符而产生问题。
4. 备份mysql数据库
要求:备份数据
#!/bin/bash
# 配置数据库连接信息
DB_USER="your_username"
DB_PASSWORD="your_password"
DB_HOST="localhost"
# 配置备份目录
BACKUP_DIR="/path/to/backup"
# 配置保留备份文件的天数
DAYS_TO_KEEP=7
# 配置要备份的数据库,若要备份所有数据库,将其设置为 all
DATABASES="your_database1 your_database2"
# 创建备份目录(如果不存在)
mkdir -p "$BACKUP_DIR"
# 获取当前日期(xx年xx月xx日)
DATE=$(date +%Y%m%d%)
# 检查数据库备份类型
if [ "$DATABASES" = "all" ]; then
# 备份所有数据库
BACKUP_FILE="$BACKUP_DIR/all_databases_$DATE.sql.gz"
mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASSWORD" --all-databases | gzip > "$BACKUP_FILE"
else
# 备份指定数据库
for DB in $DATABASES; do
BACKUP_FILE="$BACKUP_DIR/$DB_$DATE.sql.gz"
mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASSWORD" "$DB" | gzip > "$BACKUP_FILE"
done
fi
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "数据库备份成功,备份文件存储在:$BACKUP_DIR"
else
echo "数据库备份失败,请检查数据库连接信息和权限。"
fi
# 清理旧的备份文件
find "$BACKUP_DIR" -type f -name "*.sql.gz" -mtime +$DAYS_TO_KEEP -delete