Linux中用于监控的简易shell脚本怎么写

发布时间:2022-01-24 14:08:13 作者:柒染
来源:亿速云 阅读:236
# Linux中用于监控的简易shell脚本怎么写

## 前言

在Linux系统管理中,监控系统资源是日常运维的重要工作。通过编写简易的shell脚本,我们可以自动化完成CPU、内存、磁盘等关键指标的监控。本文将详细介绍如何编写实用的监控脚本,并解释关键代码的实现原理。

## 一、基础监控脚本框架

### 1.1 脚本基本结构
每个shell脚本都应包含以下基本元素:

```bash
#!/bin/bash
# 脚本描述:基础系统监控脚本
# 作者:YourName
# 日期:$(date +%Y-%m-%d)

# 定义日志文件路径
LOG_FILE="/var/log/system_monitor.log"

1.2 添加执行权限

创建脚本后需要赋予执行权限:

chmod +x monitor_script.sh

二、CPU监控实现

2.1 获取CPU使用率

get_cpu_usage() {
    local cpu_usage=$(top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1}')
    echo "CPU使用率: ${cpu_usage}%"
    
    # 预警检查(阈值80%)
    if (( $(echo "$cpu_usage > 80" | bc -l) )); then
        echo "[警告] CPU使用率超过80%!" >> $LOG_FILE
    fi
}

2.2 多核CPU监控

对于多核系统,可以监控每个核心:

get_cpu_cores() {
    local cores=$(grep -c ^processor /proc/cpuinfo)
    echo "CPU核心数: $cores"
    
    # 显示每个核心的负载
    mpstat -P ALL 1 1 | awk '/Average:/ && $2 ~ /[0-9]/ {print "核心"$2": "$3"%"}'
}

三、内存监控实现

3.1 内存使用情况

get_mem_info() {
    free -m | awk 'NR==2{printf "内存使用: %s/%sMB (%.2f%%)\n", 
                    $3,$2,$3*100/$2 }'
    
    # 缓存和缓冲区分显示
    free -m | awk 'NR==3{printf "缓存/缓冲区: %sMB\n", $3}'
}

3.2 Swap空间监控

get_swap_info() {
    local swap_usage=$(free -m | awk 'NR==4{print $3/$2*100}')
    echo "Swap使用率: ${swap_usage}%"
    
    if (( $(echo "$swap_usage > 30" | bc -l) )); then
        echo "[警告] Swap使用过高!" >> $LOG_FILE
    fi
}

四、磁盘空间监控

4.1 基础磁盘监控

get_disk_usage() {
    df -h | awk '$NF=="/"{printf "根分区: %d/%dGB (%s)\n", 
                  $3,$2,$5}'
}

4.2 多分区监控

监控所有挂载点:

check_all_disks() {
    echo "===== 磁盘使用情况 ====="
    df -h | grep -v tmpfs | \
    awk 'NR>1{print $6" 已用: "$3" 可用: "$4" ("$5")"}'
    
    # 检查超过90%的分区
    df -h | awk 'NR>1 && $5 ~ /[0-9]/ {gsub(/%/,"",$5); 
              if($5>90) print "[紧急] "$6" 使用率"$5"%"}' >> $LOG_FILE
}

五、网络连接监控

5.1 活动连接数统计

get_connections() {
    local total_conn=$(netstat -ant | wc -l)
    local established=$(netstat -ant | grep ESTABLISHED | wc -l)
    echo "总连接数: $total_conn (ESTABLISHED: $established)"
}

5.2 端口监听检查

check_listen_ports() {
    echo "监听端口:"
    ss -tulnp | awk 'NR>1{print $5}' | cut -d':' -f2 | sort -nu
}

六、日志与告警功能

6.1 日志记录实现

log_to_file() {
    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    echo "[$timestamp] $1" >> $LOG_FILE
}

6.2 邮件告警配置

需要先安装mailutils:

send_alert() {
    local subject="[ALERT] $1"
    local body="$2"
    echo "$body" | mail -s "$subject" admin@example.com
}

七、完整脚本示例

#!/bin/bash
# 系统综合监控脚本

LOG_FILE="/var/log/system_monitor_$(date +%Y%m%d).log"
THRESHOLD_CPU=80
THRESHOLD_MEM=85
THRESHOLD_DISK=90

# 初始化日志
init_log() {
    echo "=== 系统监控开始 $(date) ===" > $LOG_FILE
}

# 主监控函数
main_monitor() {
    echo -e "\n===== $(date) ====="
    
    # 调用各监控函数
    get_cpu_usage
    get_cpu_cores
    get_mem_info
    get_swap_info
    check_all_disks
    get_connections
    
    # 记录到日志
    log_to_file "监控周期完成"
}

# 执行监控
init_log
while true; do
    main_monitor
    sleep 300  # 5分钟间隔
done

八、进阶改进建议

  1. 添加进程监控:监控关键进程的存活状态
check_process() {
    if ! pgrep -x "$1" >/dev/null; then
        echo "[错误] 进程 $1 未运行!" >> $LOG_FILE
    fi
}
  1. 使用cron定时执行:通过crontab设置定期运行
# 每10分钟运行一次
*/10 * * * * /path/to/monitor_script.sh
  1. 可视化展示:将日志数据导入Prometheus+Grafana

  2. 添加HTML报告:使用awk生成HTML格式报告

结语

通过本文介绍的shell脚本编写方法,您可以构建一个轻量级的Linux系统监控方案。实际应用中,建议根据具体需求调整监控阈值和检查频率。对于更复杂的监控需求,可以考虑使用专业的监控工具如Zabbix或Nagios。

提示:所有脚本应在测试环境验证后再投入生产环境使用 “`

推荐阅读:
  1. Linux中源码包安装MySQL的shell脚本怎么写
  2. php写shell脚本

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux shell

上一篇:Linux系统下怎么重启进程

下一篇:httpd-2.2 配置及用法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》