本文详细介绍Shell脚本在运维工作中的核心逻辑模板,包括日志分析、进程监控、文件操作等场景的标准化实现方案,帮助运维工程师快速构建高效自动化脚本,提升服务器管理效率。
一、日志分析与处理模板
!/bin/bash
日志关键词监控模板
LOG_FILE="/var/log/nginx/error.log"
KEY_WORD="502 Bad Gateway"
tail -Fn0 $LOG_FILE | while read line
do
if echo "$line" | grep -q "$KEY_WORD"; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - 发现错误: $line" >> /var/log/nginx_monitor.log
触发告警动作
/usr/local/bin/send_alert.sh
fi
done
典型应用场景:
- 实时监控Nginx/PHP错误日志
- 检测系统安全事件(如SSH暴力破解)
- 应用异常状态捕获
二、进程守护与自动重启
!/bin/bash
进程守护模板
PROCESS_NAME="mysqld"
MAX_RETRY=3
check_process() {
if ! pgrep -x "$PROCESS_NAME" >/dev/null; then
echo "$(date) - 进程 $PROCESS_NAME 异常终止" >> /var/log/process_monitor.log
return 1
fi
return 0
}
for ((i=1; i<=$MAX_RETRY; i++)); do
if check_process; then
exit 0
else
systemctl restart $PROCESS_NAME
sleep 5
fi
done
多次重启失败后升级告警
echo "$(date) - 进程 $PROCESS_NAME 重启失败" | mail -s "紧急告警" admin@example.com
三、磁盘空间监控模板
!/bin/bash
磁盘空间检查模板
THRESHOLD=90
PARTITION="/dev/sda1"
usage=$(df -h | grep "$PARTITION" | awk '{print $5}' | cut -d'%' -f1)
if [ $usage -ge $THRESHOLD ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - 磁盘空间告警: $PARTITION 使用率 ${usage}%" >> /var/log/disk_monitor.log
自动清理旧日志
find /var/log -name ".log" -type f -mtime +30 -delete
fi
四、批量服务器操作模板
!/bin/bash
多主机并行执行模板
HOST_LIST=("server1" "server2" "server3")
COMMAND="uptime"
for host in "${HOST_LIST[@]}"; do
{
echo "==== $host ===="
ssh $host "$COMMAND"
} >> cluster_report.log 2>&1 &
done
wait 等待所有后台任务完成
echo "所有服务器状态收集完成"
五、配置文件自动化管理
!/bin/bash
配置差异对比与同步模板
CONFIG_FILE="/etc/nginx/nginx.conf"
TEMPLATE_FILE="/opt/conf/nginx.conf.template"
BACKUP_DIR="/etc/nginx/backup"
生成配置校验和
old_checksum=$(md5sum $CONFIG_FILE | cut -d' ' -f1)
new_checksum=$(md5sum $TEMPLATE_FILE | cut -d' ' -f1)
if [ "$old_checksum" != "$new_checksum" ]; then
备份旧配置
cp "$CONFIG_FILE" "$BACKUP_DIR/nginx.conf.$(date +%Y%m%d%H%M%S)"
应用新配置
cp "$TEMPLATE_FILE" "$CONFIG_FILE"
重载服务
systemctl reload nginx
echo "配置文件已更新并重载服务"
fi
最佳实践建议
- 所有脚本添加
set -e
确保错误立即退出 - 关键操作前进行预检查(如磁盘空间是否足够)
- 重要操作必须记录审计日志
- 使用
lockfile
防止脚本重复执行 - 通过
timeout
命令设置超时机制
评论