Shell 性能监控:指标采集、告警规则与可视化大盘设计


一、前言

Shell 性能监控:指标采集、告警规则与可视化大盘设计是运维工程师和全栈开发者的必备技能。本文从Shell和监控出发,配有完整的命令和脚本示例。


二、常用命令速查

2.1 系统监控

bash 复制代码
# CPU 和内存使用
top -c
htop  # 更直观

# 磁盘使用
df -h
du -sh /* 2>/dev/null | sort -hr | head -10

# 网络连接
ss -tulnp | grep :80
netstat -anp | grep ESTABLISHED

# 进程监控
ps aux | grep java | grep -v grep

2.2 日志分析

bash 复制代码
# 实时查看日志
tail -f /var/log/nginx/access.log

# 过滤错误日志
grep -E "ERROR|FATAL" /var/log/app/error.log | tail -50

# 分析访问日志统计
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head -20

# 查看错误率
awk '{if ($9 >= 400) count++} END {print "错误率:", count/NR*100"%"}' access.log

三、Shell 脚本实战

3.1 自动化部署脚本

bash 复制代码
#!/bin/bash
set -euo pipefail

APP_NAME="myapp"
DEPLOY_DIR="/opt/${APP_NAME}"
BACKUP_DIR="/opt/backups/${APP_NAME}"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

echo "=== 开始部署 ${APP_NAME} ==="

# 1. 备份旧版本
if [ -d "${DEPLOY_DIR}" ]; then
    echo "备份旧版本到 ${BACKUP_DIR}/${TIMESTAMP}"
    mkdir -p "${BACKUP_DIR}"
    cp -r "${DEPLOY_DIR}" "${BACKUP_DIR}/${TIMESTAMP}"
fi

# 2. 停止旧服务
echo "停止旧服务..."
systemctl stop "${APP_NAME}" || pkill -f "${APP_NAME}"

# 3. 部署新版本
echo "拉取最新镜像..."
docker pull myregistry:5000/${APP_NAME}:latest

docker-compose down
docker-compose up -d

# 4. 健康检查
echo "等待服务启动..."
sleep 10
curl -f http://localhost:8080/health || { echo "健康检查失败,回滚!"; exit 1; }

echo "=== 部署成功 ==="

3.2 日志清理脚本

bash 复制代码
#!/bin/bash
# 清理 7 天前的日志文件,保留最近 100MB

LOG_DIR="/var/log/myapp"
MAX_AGE=7
MAX_SIZE_MB=100

# 删除过期日志
find "${LOG_DIR}" -name "*.log.*" -mtime +${MAX_AGE} -delete

# 如果总大小超过限制,删除最旧的
TOTAL_SIZE=$(du -sm "${LOG_DIR}" | cut -f1)
if [ "${TOTAL_SIZE}" -gt "${MAX_SIZE_MB}" ]; then
    echo "日志大小超限 (${TOTAL_SIZE}MB),清理最旧的文件..."
    find "${LOG_DIR}" -name "*.log.*" -printf '%T+ %p
' |
        sort | head -n 20 | cut -d' ' -f2- | xargs rm -f
fi

echo "日志清理完成,当前大小: $(du -sh ${LOG_DIR})"

四、Nginx 配置

4.1 反向代理配置

nginx 复制代码
server {
    listen 80;
    server_name myapp.example.com;

    # HTTP 跳转到 HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name myapp.example.com;

    ssl_certificate /etc/ssl/certs/myapp.crt;
    ssl_certificate_key /etc/ssl/private/myapp.key;
    ssl_protocols TLSv1.2 TLSv1.3;

    # 安全头
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 超时配置
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }

    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        proxy_pass http://127.0.0.1:8080;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

五、总结

  1. 监控先行------没有监控的服务器等于裸奔
  2. 日志要分级和轮转------防止磁盘撑满
  3. 脚本要加 set -euo pipefail------提前失败,避免连锁反应
  4. 配置变更要备份------出问题能快速回滚

💬 收藏本文!关注我,后续更新更多 Linux 运维实战系列。


💬 觉得有用的话,点个赞+收藏,关注我,持续更新优质技术内容!

标签:Shell | 监控 | Prometheus | Grafana | 运维

相关推荐
22信通小白4 小时前
USRP初学者使用手册(基础配置及bug记录)——Linux+Clion(单台X310收发)
linux·运维·c++·5g·bug·信息与通信
TechMasterPlus5 小时前
Linux U-Boot 与内核启动流程深度解析:从上电到 Shell 的完整之旅
linux·运维·服务器
大白菜和MySQL5 小时前
Linux下dhcp服务搭建
linux·运维·服务器
SPC的存折6 小时前
1、MySQL故障排查与运维案例
linux·运维·服务器·数据库·mysql
Run_Teenage6 小时前
Linux:认识信号,理解信号的产生和处理
linux·运维·算法
CDN3606 小时前
高防服务器磁盘 / CPU 爆满?攻击引流与资源扩容实战
运维·服务器·网络协议
freewlt6 小时前
OpenClaw 工作流自动化实战:打造你的智能定时任务中心
运维·servlet·自动化
Amnesia0_06 小时前
理解Linux中的OS管理和进程属性
linux·运维·服务器
小夏子_riotous6 小时前
openstack的使用——7. 共享文件系统manila服务
linux·运维·服务器·系统架构·centos·openstack·运维开发