在日常运维工作中,Shell脚本是不可或缺的强大工具。通过编写和使用Shell脚本,运维人员可以实现任务的自动化,提高工作效率,减少人为错误。
1. 检查磁盘空间
#!/bin/bash
# 检查磁盘空间,如果根分区使用率超过80%,则发送警告邮件
THRESHOLD=80
EMAIL="admin@example.com"
df -h | grep -q "/dev/root"
if [ $? -eq 0 ]; then
USAGE=$(df -h | grep "/dev/root" | awk '{ print $5 }' | sed 's/%//g')
if [ $USAGE -ge $THRESHOLD ]; then
echo "警告:根分区使用率已达 $USAGE%" | mail -s "磁盘空间警告" $EMAIL
fi
fi
2. 监控内存使用
#!/bin/bash
# 监控内存使用率,如果超过80%,则记录到日志文件
THRESHOLD=80
MEM_USAGE=$(free -m | awk 'NR==2{printf "%.2f", $3*100/$2 }')
if [ $MEM_USAGE -ge $THRESHOLD ]; then
echo "$(date): 内存使用率已达 $MEM_USAGE%" >> /var/log/mem_usage.log
fi
3. 服务状态检查
#!/bin/bash
# 检查nginx服务是否运行,如果未运行则尝试重启
SERVICE="nginx"
if ! systemctl is-active --quiet $SERVICE; then
echo "$SERVICE 服务未运行,尝试重启..."
systemctl restart $SERVICE
fi
4. 清理旧日志文件
#!/bin/bash
# 清理/var/log目录下超过7天的日志文件
find /var/log -type f -mtime +7 -exec rm -f {} \;
5. MySQL数据库备份
#!/bin/bash
# 每天备份MySQL数据库
BACKUP_DIR="/path/to/backup"
DATE=$(date +%F)
mysqldump -u root -p'yourpassword' yourdatabase > $BACKUP_DIR/yourdatabase_$DATE.sql
6. 重启资源消耗过高的进程
#!/bin/bash
# 重启CPU使用率超过80%的进程
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
if [ $CPU_USAGE -gt 80 ]; then
echo "系统负载过高,重启系统..."
reboot
fi
7. 检查端口开放状态
#!/bin/bash
# 检查指定端口是否开放
PORT=$1
if netstat -tuln | grep $PORT; then
echo "端口 $PORT 已开放"
else
echo "端口 $PORT 未开放"
fi
8. 同步文件到备份服务器
#!/bin/bash
# 使用rsync同步文件到备份服务器
rsync -avz /path/to/source user@backupserver:/path/to/destination
9. 系统资源监控
#!/bin/bash
# 监控并报告CPU和内存使用情况
while true; do
echo "CPU: $(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')%"
echo "MEM: $(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')"
sleep 60
done
10. 检查磁盘I/O
#!/bin/bash
# 监控磁盘I/O,如果超过阈值,则发送警告
IO_WAIT=$(iostat -dx /dev/sda | awk 'NR==4{print $4+$5}')
if [ $IO_WAIT -gt 60 ]; then
echo "警告:磁盘I/O等待时间超过60%" | mail -s "磁盘I/O警告" admin@example.com
fi
当然,这里是另外10个实用的运维Shell脚本:
11. 检查磁盘空间并清理
#!/bin/bash
# 检查磁盘空间,如果使用率超过90%,则清理/tmp目录下的文件
THRESHOLD=90
if [ $(df / | awk 'NR==2{print $5}' | sed 's/%//g') -ge $THRESHOLD ]; then
echo "磁盘空间使用率超过$THRESHOLD%,开始清理/tmp目录..."
find /tmp -type f -delete
fi
12. 监控特定服务状态
#!/bin/bash
# 监控特定服务状态,如果服务未运行,则尝试重启
SERVICE="httpd"
if ! systemctl is-active --quiet $SERVICE; then
echo "$SERVICE 服务未运行,尝试重启..."
systemctl start $SERVICE
fi
13. 备份配置文件
#!/bin/bash
# 备份/etc/目录下的配置文件到/backup/
DATE=$(date +%Y%m%d)
tar -czf /backup/config_backup_$DATE.tar.gz /etc/
14. 检查系统日志错误
#!/bin/bash
# 检查系统日志中的错误信息
grep -i "error" /var/log/syslog | mail -s "系统日志错误" admin@example.com
15. 检查系统运行时间
#!/bin/bash
# 检查系统运行时间,如果超过7天,则发送警告邮件
DAYS=$(uptime -s | awk -F' ' '{print ($1+0)}')
if [ $DAYS -gt 7 ]; then
echo "系统已运行超过7天" | mail -s "系统运行时间警告" admin@example.com
fi
16. 重启网络服务
#!/bin/bash
# 重启网络服务
service network restart
17. 检查磁盘I/O等待时间
#!/bin/bash
# 检查磁盘I/O等待时间,如果超过50%,则发送警告
IO_WAIT=$(iostat /dev/sda 1 2 | tail -1 | awk '{print $4+$5}')
if [ $IO_WAIT -gt 50 ]; then
echo "磁盘I/O等待时间超过50%" | mail -s "磁盘I/O警告" admin@example.com
fi
18. 检查系统端口开放状态
#!/bin/bash
# 检查系统端口开放状态,如果指定端口未开放,则发送警告
PORT=$1
if ! netstat -tuln | grep $PORT; then
echo "端口$PORT未开放" | mail -s "端口开放状态警告" admin@example.com
fi
19. 文件同步
#!/bin/bash
rsync -avz /src/ /dst/
echo "/src/ to /dst/"
20.比较两个目录的内容
#!/bin/bash
diff -rq /dir1 /dir2
近期文章:
运维封了这30端口,黑客哭了 !!! 要被优化 !!! 一个人运维了1000台服务器之后 19500 Star开源 ! 6步部署6000万用户的网站 5200 Star开源 ! 6步安装MarkDown协作神器 1400 Star开源 !!! 只要5步安装书签神器 |