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 | 运维

相关推荐
wkd_0077 分钟前
Ubuntu 22.04 Samba 连接故障排查记:从“用户名或密码错误”到 NTLM 版本不兼容
linux·运维·ubuntu
企服AI产品测评局22 分钟前
Agent适配信创环境实测:企业级自动化如何实现国产操作系统与数据库全兼容?
运维·数据库·人工智能·ai·chatgpt·自动化
mixboot1 小时前
Linux 进程工作目录查看利器:pwdx 命令详解
linux·运维·服务器
盖小雅2 小时前
自动化排班如何破解劳动法合规难题:从规则冲突到可追溯的排班表
大数据·运维·机器学习·自动化
NiceCloud喜云2 小时前
Claude Code Routines 实战:三种触发器跑通云端自动化编码
android·运维·数据库·人工智能·自动化·json·飞书
zhz52144 小时前
服务器等保加固实施报告
运维·服务器·信创·国密·等保
REDcker5 小时前
SSH客户端选型与实践
运维·ssh
s_w.h5 小时前
【 linux 】文件系统
linux·运维·服务器·算法·bash
duoduo_sing6 小时前
数据库备份终极方案:从脚本手动到自动化热备+异地同步实战
运维·数据库·自动化·用友