返回目录

Shell脚本运维实用技巧

常用Shell脚本与自动化运维案例汇总

服务器信息收集脚本

快速收集服务器的IP、主机名、CPU、内存、磁盘、负载等关键信息,便于批量巡检和资产管理。

#!/bin/bash #收集服务器信息脚本 ip_info=$(ifconfig | grep "Bcast" | tail -1 | awk '{print $2}' | cut -d: -f 2) cpu_info1=$(cat /proc/cpuinfo | grep 'model name' | tail -1 | awk -F: '{print $2}' | sed 's/^ //g' | awk '{print $1,$3,$4,$NF}') cpu_info2=$(cat /proc/cpuinfo | grep "physical id" | sort | uniq -c | wc -l) serv_info=$(hostname | tail -1) disk_info=$(fdisk -l | grep "Disk" | grep -v "identifier" | awk '{print $2,$3,$4}' | sed 's/,//g') mem_info=$(free -m | grep "Mem" | awk '{print "Total",$1,$2"M"}') load_info=$(uptime | awk '{print "Current Load: "$(NF-2)}' | sed 's/,//g') mark_info='BeiJing_IDC' echo -e "\033[32m-------------------------------------------\033[1m" echo "IPADDR: ${ip_info}" echo "HOSTNAME: $serv_info" echo "CPU_INFO: ${cpu_info1} X${cpu_info2}" echo "DISK_INFO: $disk_info" echo "MEM_INFO: $mem_info" echo "LOAD_INFO: $load_info" echo -e "\033[32m-------------------------------------------\033[0m" #echo -e → 启用反斜杠转义符的解释(如 ANSI 颜色代码的 \033)。 #\033[32m → 将文本颜色设置为绿色(ANSI 颜色代码 32)。 #------------------------------------------- → 要打印的实际行。 #\033[1m → 将文本设为粗体(ANSI 代码 1)。 #\033[0m → (可选) 重置格式(不存在于命令中,但通常在末尾使用)。

脚本说明:

  • 自动输出服务器的IP、主机名、CPU型号与核数、磁盘、内存、负载等信息
  • 适合批量巡检、资产盘点、自动化运维场景

nginx日志切割自动化脚本

定时切割nginx日志,归档历史日志并自动清理过期日志,保障日志管理有序。

#!/bin/bash #nginx日志切割脚本,建议写入crontab每天0点自动执行 logs_path="/opt/ng1.28/logs/" year=$(date -d "yesterday" +%Y) month=$(date -d "yesterday" +%m) day=$(date -d "yesterday" +%d) mkdir -p "${logs_path}${year}/${month}" mv "${logs_path}access.log" "${logs_path}${year}/${month}/access_${year}-${month}-${day}.log" nginx_pid=$(cat "${logs_path}nginx.pid") kill -USR1 "$nginx_pid" echo "日志已成功切割至: ${logs_path}${year}/${month}/access_${year}-${month}-${day}.log" find "${logs_path}" -type f -name "access_*.log" -mtime +6 -exec rm -f {} \; echo "已清理 7 天前的旧日志"

脚本说明:

  • 自动归档nginx access日志,按年月日分目录保存
  • 向nginx主进程发送USR1信号,触发日志文件重新生成
  • 自动清理7天前的旧日志,节省磁盘空间
💡 使用建议: 将脚本加入crontab定时任务:0 0 * * * /path/to/nginx_log_rotate.sh

服务状态监控与自动重启脚本

自动检测关键服务(如nginx)是否存活,异常时自动重启并记录日志,提升服务可用性。

#!/bin/bash # 检查 Nginx 服务状态,如果停止则重启并记录 SERVICE_NAME="nginx" LOG_FILE="/var/log/service_monitor.log" if ! systemctl is-active --quiet "$SERVICE_NAME"; then echo "[$(date)] - $SERVICE_NAME is DOWN. Attempting to restart..." >> "$LOG_FILE" systemctl restart "$SERVICE_NAME" if systemctl is-active --quiet "$SERVICE_NAME"; then echo "[$(date)] - $SERVICE_NAME restarted SUCCESSFULLY." >> "$LOG_FILE" else echo "[$(date)] - ERROR: Failed to restart $SERVICE_NAME!" >> "$LOG_FILE" # 可扩展为邮件/短信/电话告警 fi fi

脚本说明:

  • 定时检测服务状态,发现服务异常自动重启
  • 重启结果写入日志,便于后续排查
  • 可扩展为多服务监控、邮件/短信告警等
💡 使用建议: 配合crontab定时执行,如每5分钟检测一次:*/5 * * * * /path/to/service_monitor.sh

运维自动化建议

  • 脚本需定期维护,路径、服务名等参数建议变量化
  • 重要脚本建议加日志输出,便于追踪和排错
  • 可结合crontab实现全自动化运维
  • 生产环境建议加权限控制,防止误操作