高效运维:10个功能强悍的Shell监控脚本
mhr18 2025-08-03 06:05 4 浏览 0 评论
在当今复杂多变的运维环境中,Shell脚本因其灵活性和高效性,成为运维工程师不可或缺的工具之一。本文将详细介绍10个功能强悍的Shell监控脚本,旨在帮助运维人员更好地应对各种挑战,确保系统稳定运行。每个脚本均附有详细代码及应用场景,助力运维工作更加智能化、自动化。
1. CPU使用率监控脚本
代码示例:
#!/bin/bash
LOG_FILE="/var/log/cpu_usage.log"
THRESHOLD=80
get_cpu_usage() {
mpstat 1 1 | awk '/Average/ {print 100 - $NF"%"}' | sed 's/%//g'
}
current_usage=$(get_cpu_usage)
echo"$(date '+%Y-%m-%d %H:%M:%S') CPU Usage: $current_usage" >> $LOG_FILE
if [ $current_usage -ge $THRESHOLD ]; then
echo"Warning: CPU usage is above $THRESHOLD%!" | mail -s "CPU Usage Alert" admin@example.com
fi
应用场景:
该脚本每秒钟监控一次CPU使用率,并将结果记录到日志文件中。当CPU使用率超过设定的阈值(如80%)时,发送邮件警报给管理员。适用于需要实时监控CPU性能的场景,如高并发Web服务器或数据库服务器。
2. 内存使用情况监控脚本
代码示例:
#!/bin/bash
LOG_FILE="/var/log/memory_usage.log"
THRESHOLD=80
get_memory_usage() {
free | awk '/^Mem:/{print $3/$2 * 100.0}' | sed 's/%//g'
}
current_usage=$(get_memory_usage)
echo"$(date '+%Y-%m-%d %H:%M:%S') Memory Usage: $current_usage" >> $LOG_FILE
if [ $current_usage -ge $THRESHOLD ]; then
echo"Warning: Memory usage is above $THRESHOLD%!" | mail -s "Memory Usage Alert" admin@example.com
fi
应用场景:
类似于CPU监控脚本,该脚本监控内存使用情况,并在内存使用率超过阈值时发送警报。适用于内存资源紧张的环境,如大数据处理或内存密集型应用服务器。
3. 磁盘空间监控脚本
代码示例:
#!/bin/bash
LOG_FILE="/var/log/disk_usage.log"
THRESHOLD=90
check_disk_usage() {
df -h | awk '$NF=="/"{print $5}' | sed 's/%//g'
}
current_usage=$(check_disk_usage)
echo"$(date '+%Y-%m-%d %H:%M:%S') Disk Usage: $current_usage" >> $LOG_FILE
if [ $current_usage -ge $THRESHOLD ]; then
echo"Warning: Disk usage is above $THRESHOLD%!" | mail -s "Disk Usage Alert" admin@example.com
fi
应用场景:
监控根分区的磁盘使用情况,当磁盘使用率超过阈值时发送警报。适用于需要确保磁盘空间充足以避免数据丢失或系统崩溃的场景。
4. 网络接口流量监控脚本
代码示例:
#!/bin/bash
LOG_FILE="/var/log/network_traffic.log"
THRESHOLD_IN=100000 # 100Mbps in bytes/sec
THRESHOLD_OUT=100000 # 100Mbps in bytes/sec
get_network_traffic() {
iface="eth0"
rx=$(cat /sys/class/net/$iface/statistics/rx_bytes)
tx=$(cat /sys/class/net/$iface/statistics/tx_bytes)
sleep 1
rx_new=$(cat /sys/class/net/$iface/statistics/rx_bytes)
tx_new=$(cat /sys/class/net/$iface/statistics/tx_bytes)
rx_rate=$(( (rx_new - rx) / 1024 / 1024 ))
tx_rate=$(( (tx_new - tx) / 1024 / 1024 ))
echo"$rx_rate $tx_rate"
}
current_rx_rate $(echo $(get_network_traffic) | awk '{print $1}')
current_tx_rate $(echo $(get_network_traffic) | awk '{print $2}')
echo"$(date '+%Y-%m-%d %H:%M:%S') Network Traffic: RX $current_rx_rate MB/s, TX $current_tx_rate MB/s" >> $LOG_FILE
if [ $current_rx_rate -ge $THRESHOLD_IN ] || [ $current_tx_rate -ge $THRESHOLD_OUT ]; then
echo"Warning: Network traffic exceeds thresholds!" | mail -s "Network Traffic Alert" admin@example.com
fi
应用场景:
监控特定网络接口(如eth0)的入站和出站流量,并在流量超过设定阈值时发送警报。适用于需要确保网络带宽充足以避免性能瓶颈的场景,如Web服务器或视频流媒体服务器。
5. 进程监控脚本
代码示例:
#!/bin/bash
LOG_FILE="/var/log/process_monitor.log"
PROCESS_NAME="nginx"
check_process() {
pgrep -x $PROCESS_NAME > /dev/null
if [ $? -eq 0 ]; then
echo"Process $PROCESS_NAME is running."
return 0
else
echo"Process $PROCESS_NAME is NOT running."
return 1
fi
}
status=$(check_process)
echo"$(date '+%Y-%m-%d %H:%M:%S') $PROCESS_NAME Status: $status" >> $LOG_FILE
if [ $status -eq 1 ]; then
echo"Warning: $PROCESS_NAME is not running!" | mail -s "$PROCESS_NAME Down Alert" admin@example.com
# Optionally, you can add a command to start the process here
# systemctl start nginx
fi
应用场景:
监控特定进程(如nginx)的运行状态,并在进程异常终止时发送警报。适用于需要确保关键服务持续运行的场景,如Web服务器或数据库服务。
6. 日志轮转监控脚本
代码示例:
#!/bin/bash
LOG_DIR="/var/log"
DAYS_THRESHOLD=7
rotate_logs() {
find $LOG_DIR -type f -name "*.log" -mtime +$DAYS_THRESHOLD -exec gzip {} \; -exec rm {} \;
}
rotate_logs
echo "$(date '+%Y-%m-%d %H:%M:%S') Logs rotated for files older than $DAYS_THRESHOLD days." >> /var/log/log_rotation.log
应用场景:
定期轮转日志文件,压缩并删除超过指定天数(如7天)的旧日志文件。适用于需要管理大量日志文件以节省磁盘空间的场景,如大型Web应用或系统日志服务器。
7. 系统负载监控脚本
代码示例:
#!/bin/bash
LOG_FILE="/var/log/system_load.log"
THRESHOLD=5.0
get_system_load() {
uptime | awk -F'load average:''{ print $2 }' | awk '{ print $1,$2,$3 }'
}
current_load=$(get_system_load)
echo"$(date '+%Y-%m-%d %H:%M:%S') System Load: $current_load" >> $LOG_FILE
load_avg=$(echo$current_load | awk '{print $1}')
if [ $(echo"$load_avg > $THRESHOLD" | bc -l) -eq 1 ]; then
echo"Warning: System load is above $THRESHOLD!" | mail -s "System Load Alert" admin@example.com
fi
应用场景:
监控系统负载,并在负载超过设定阈值时发送警报。适用于需要确保系统性能稳定的场景,如高并发应用服务器或数据库服务器。
8. 服务状态监控脚本
代码示例:
#!/bin/bash
LOG_FILE="/var/log/service_status.log"
SERVICES=("nginx""mysql""redis")
check_services() {
for service in"${SERVICES[@]}"; do
systemctl is-active --quiet $service
if [ $? -ne 0 ]; then
echo"$(date '+%Y-%m-%d %H:%M:%S') Service $service is NOT active." >> $LOG_FILE
echo"Warning: Service $service is down!" | mail -s "$service Down Alert" admin@example.com
else
echo"$(date '+%Y-%m-%d %H:%M:%S') Service $service is active." >> $LOG_FILE
fi
done
}
check_services
应用场景:
监控一组关键服务(如nginx、mysql、redis)的状态,并在服务异常时发送警报。适用于需要确保多个服务协同运行的环境,如微服务架构或复杂应用部署。
9. I/O性能监控脚本
代码示例:
#!/bin/bash
LOG_FILE="/var/log/io_performance.log"
THRESHOLD_READ=5000 # IOPS threshold for read operations
THRESHOLD_WRITE=5000 # IOPS threshold for write operations
get_io_performance() {
iostat -dx 1 1 | awk '/^Device/ { if ($1 != "Device") print $1, $12, $13 }' | sed 's/ //g'
}
current_io=$(get_io_performance)
device=$(echo$current_io | awk '{print $1}')
read_iops=$(echo$current_io | awk '{print $2}')
write_iops=$(echo$current_io | awk '{print $3}')
echo"$(date '+%Y-%m-%d %H:%M:%S') $device IO Performance: Read $read_iops IOPS, Write $write_iops IOPS" >> $LOG_FILE
if [ $read_iops -ge $THRESHOLD_READ ] || [ $write_iops -ge $THRESHOLD_WRITE ]; then
echo"Warning: I/O performance exceeds thresholds for $device!" | mail -s "I/O Performance Alert" admin@example.com
fi
应用场景:
监控特定磁盘设备的I/O性能,包括读和写操作的IOPS(每秒输入输出操作数),并在性能超过设定阈值时发送警报。适用于需要确保存储系统性能的场景,如数据库服务器或大数据处理平台。
10. 系统安全监控脚本
代码示例:
#!/bin/bash
LOG_FILE="/var/log/security_monitor.log"
UNAUTHORIZED_USERS=("user1""user2")
check_unauthorized_users() {
for user in"${UNAUTHORIZED_USERS[@]}"; do
ifid"$user" &>/dev/null; then
echo"$(date '+%Y-%m-%d %H:%M:%S') Unauthorized user $user found on the system." >> $LOG_FILE
echo"Warning: Unauthorized user $user detected!" | mail -s "Security Alert" admin@example.com
fi
done
}
check_recent_logins() {
lastb | awk '{print $1, $3}' | sort | uniq -c | sort -nr | head -n 10
}
check_unauthorized_users
recent_logins=$(check_recent_logins)
echo"$(date '+%Y-%m-%d %H:%M:%S') Recent Failed Logins:\n$recent_logins" >> $LOG_FILE
# Optionally, you can set up an alert based on the number of failed logins or specific patterns
应用场景:
监控系统中是否存在未经授权的用户账户,并检查最近的失败登录尝试。适用于需要加强系统安全性的场景,如敏感数据处理环境或高安全性要求的服务器。
相关推荐
- Java面试题及答案总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Redis、Linux、SpringBoot、Spring、MySQ...
- Java面试题及答案最全总结(2025春招版)
-
大家好,我是Java面试分享最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Spring...
- Java面试题及答案最全总结(2025版持续更新)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 蚂蚁金服面试题(附答案)建议收藏:经典面试题解析
-
前言最近编程讨论群有位小伙伴去蚂蚁金服面试了,以下是面试的真题,跟大家一起来讨论怎么回答。点击上方“捡田螺的小男孩”,选择“设为星标”,干货不断满满1.用到分布式事务嘛?为什么用这种方案,有其他方案...
- 测试工程师面试必问的十道题目!全答上来的直接免试
-
最近参加运维工程师岗位的面试,笔者把自己遇到的和网友分享的一些常见的面试问答收集整理出来了,希望能对自己和对正在准备面试的同学提供一些参考。一、Mongodb熟悉吗,一般部署几台?部署过,没有深入研究...
- 10次面试9次被刷?吃透这500道大厂Java高频面试题后,怒斩offer
-
很多Java工程师的技术不错,但是一面试就头疼,10次面试9次都是被刷,过的那次还是去了家不知名的小公司。问题就在于:面试有技巧,而你不会把自己的能力表达给面试官。应届生:你该如何准备简历,面试项目和...
- java高频面试题整理
-
【高频常见问题】1、事务的特性原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。一致性或可串性:事务的执行使得数据库从一种正确状态转换成另一种正确状态隔离性:在事务正确提交之前,不允许把该...
- 2025 年最全 Java 面试题,京东后端面试面经合集,答案整理
-
最近京东搞了个TGT计划,针对顶尖青年技术天才,直接宣布不设薪资上限。TGT计划面向范围包括2023年10月1日到2026年9月30日毕业的海内外本硕博毕业生。时间范围还...
- idGenerator测评
-
工作中遇到需要生成随机数的需求,看了一个个人开发的基于雪花算法的工具,今天进行了一下测评(测试)。idGenerator项目地址见:https://github.com/yitter/IdGenera...
- 2024年开发者必备:MacBook Pro M1 Max深度体验与高效工作流
-
工作机器我使用的是一台16英寸的MacBookProM1Max。这台电脑的表现堪称惊人!它是我用过的最好的MacBook,短期内我不打算更换它。性能依然出色,即使在执行任务时也几乎听不到风扇的...
- StackOverflow 2022 年度调查报告
-
一个月前,StackOverflow开启了2022年度开发者调查,历时一个半月,在6月22日,StackOverflow正式发布了2022年度开发者调查报告。本次报告StackO...
- 这可能是最全面的SpringDataMongoDB开发笔记
-
MongoDB数据库,在最近使用越来越广泛,在这里和Java的开发者一起分享一下在Java中使用Mongodb的相关笔记。希望大家喜欢。关于MongoDB查询指令,请看我的上一篇文章。SpringD...
- Mac M2 本地部署ragflow
-
修改配置文件Dockerfile文件ARGNEED_MIRROR=1//开启国内镜像代理docker/.envREDIS_PORT=6380//本地redis端口冲突RAGFLOW_IMA...
- 别再傻傻分不清!localhost、127.0.0.1、本机IP,原来大有讲究!
-
调试接口死活连不上?部署服务队友访问不了?八成是localhost、127.0.0.1、本机IP用混了!这三个看似都指向“自己”的东西,差之毫厘谬以千里。搞不清它们,轻则调试抓狂,重则服务裸奔。loc...
- 我把 Mac mini 托管到机房了:一套打败云服务器的终极方案
-
我把我积灰的Macmini托管到机房了,有图有真相。没想到吧?一台在家吃灰的苹果电脑,帮我省了大钱!对,就是控制了自己的服务器,省了租用云服务器的钱,重要数据还全捏在自己手里,这感觉真爽。你可...
你 发表评论:
欢迎- 一周热门
-
-
Redis客户端 Jedis 与 Lettuce
-
高并发架构系列:Redis并发竞争key的解决方案详解
-
redis如何防止并发(redis如何防止高并发)
-
Java SE Development Kit 8u441下载地址【windows版本】
-
redis安装与调优部署文档(WinServer)
-
开源推荐:如何实现的一个高性能 Redis 服务器
-
Redis 入门 - 安装最全讲解(Windows、Linux、Docker)
-
一文带你了解 Redis 的发布与订阅的底层原理
-
Redis如何应对并发访问(redis控制并发量)
-
Oracle如何创建用户,表空间(oracle19c创建表空间用户)
-
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- redis 命令 (83)
- php redis (97)
- redis 存储 (67)
- redis 锁 (74)
- 启动 redis (73)
- redis 时间 (60)
- redis 删除 (69)
- redis内存 (64)
- redis并发 (53)
- redis 主从 (71)
- redis同步 (53)
- redis结构 (53)
- redis 订阅 (54)
- redis 登录 (62)
- redis 面试 (58)
- redis问题 (54)
- 阿里 redis (67)
- redis的缓存 (57)
- lua redis (59)
- redis 连接池 (64)