在运维工作中,Shell脚本是每个工程师的必备技能。它们不仅能自动化繁琐的任务,还能大幅提升工作效率。
- 服务器健康检查脚本
这个脚本可以定期检查服务器的CPU、内存、磁盘和网络状态,并将结果输出到日志文件中。通过这个脚本,你可以及时发现服务器的潜在问题。
#!/bin/bash
echo "===== 服务器健康检查 ====="
echo "检查时间: $(date)"
echo "CPU使用率: $(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')%"
echo "内存使用率: $(free -m | awk 'NR==2{printf "%.2f%%\n", $3*100/$2 }')"
echo "磁盘使用率: $(df -h | awk '$NF=="/"{printf "%s\n", $5}')"
echo "网络连接数: $(netstat -an | grep ESTABLISHED | wc -l)"
echo "=========================="
- 日志清理脚本
日志文件会随着时间的推移不断增长,占用大量磁盘空间。这个脚本可以自动清理超过30天的日志文件,并保留最近7天的日志。
#!/bin/bash
LOG_DIR="/var/log"
DAYS_TO_KEEP=7
echo "开始清理日志文件..."
find $LOG_DIR -type f -name "*.log" -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
echo "已清理超过 $DAYS_TO_KEEP 天的日志文件。"
echo "当前日志目录大小: $(du -sh $LOG_DIR | awk '{print $1}')"
echo "日志清理完成!"
- 自动备份脚本
数据备份是运维工作中的重中之重。这个脚本可以定期备份指定目录,并将备份文件压缩存储,同时删除超过30天的旧备份。
#!/bin/bash
BACKUP_DIR="/backup"
SOURCE_DIR="/data"
DATE=$(date +%Y%m%d)
BACKUP_FILE="$BACKUP_DIR/backup_$DATE.tar.gz"
echo "开始备份 $SOURCE_DIR 目录..."
tar -czf $BACKUP_FILE $SOURCE_DIR
echo "备份完成,文件保存在: $BACKUP_FILE"
echo "清理超过30天的旧备份..."
find $BACKUP_DIR -type f -name "*.tar.gz" -mtime +30 -exec rm -f {} \;
echo "备份任务完成!"
- 监控网络连接脚本
这个脚本可以监控服务器的网络连接情况,统计每个IP的连接数,并按连接数排序输出,方便排查异常连接。
#!/bin/bash
echo "当前网络连接状态:"
netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
echo "总连接数: $(netstat -an | grep ESTABLISHED | wc -l)"
echo "连接数最多的IP: $(netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 1)"
- 自动重启服务脚本
当某个服务崩溃时,这个脚本可以自动检测并重启服务,同时记录重启日志。
#!/bin/bash
SERVICE="nginx"
LOG_FILE="/var/log/service_monitor.log"
if systemctl is-active --quiet $SERVICE; then
echo "$(date): $SERVICE 正在运行。" >> $LOG_FILE
else
echo "$(date): $SERVICE 未运行,尝试重启..." >> $LOG_FILE
systemctl restart $SERVICE
if systemctl is-active --quiet $SERVICE; then
echo "$(date): $SERVICE 重启成功。" >> $LOG_FILE
else
echo "$(date): $SERVICE 重启失败,请手动检查!" >> $LOG_FILE
fi
fi
- 磁盘空间报警脚本
当磁盘空间不足时,这个脚本会自动发送邮件报警,并列出占用空间最大的前10个文件。
#!/bin/bash
THRESHOLD=90
USAGE=$(df / | grep / | awk '{print $5}' | sed 's/%//g')
if [ $USAGE -gt $THRESHOLD ]; then
echo "磁盘空间不足,当前使用率: $USAGE%" | mail -s "磁盘空间报警" admin@example.com
echo "占用空间最大的文件:"
du -ah / | sort -rh | head -n 10
fi
- 自动更新系统脚本
这个脚本可以自动更新系统软件包,并记录更新日志,同时重启需要重启的服务。
#!/bin/bash
LOG_FILE="/var/log/system_update.log"
echo "$(date): 开始系统更新..." >> $LOG_FILE
apt-get update && apt-get upgrade -y >> $LOG_FILE
echo "$(date): 系统更新完成。" >> $LOG_FILE
echo "需要重启的服务:"
systemctl list-units --state=needs-reloading
- 监控进程脚本
这个脚本可以监控指定进程的运行状态,并在进程异常时发送报警。
#!/bin/bash
PROCESS="java"
LOG_FILE="/var/log/process_monitor.log"
if ! pgrep $PROCESS > /dev/null; then
echo "$(date): $PROCESS 进程异常,尝试重启..." >> $LOG_FILE
systemctl restart $PROCESS
if pgrep $PROCESS > /dev/null; then
echo "$(date): $PROCESS 重启成功。" >> $LOG_FILE
else
echo "$(date): $PROCESS 重启失败,请手动检查!" >> $LOG_FILE
fi
fi
- 自动同步时间脚本
服务器时间同步非常重要,这个脚本可以定期同步系统时间,并检查同步结果。
#!/bin/bash
echo "开始同步时间..."
ntpdate pool.ntp.org
if [ $? -eq 0 ]; then
echo "时间同步成功,当前时间: $(date)"
else
echo "时间同步失败,请检查网络连接!"
fi
- 批量管理服务器脚本
这个脚本可以批量管理多台服务器,执行相同的命令,并输出每台服务器的执行结果。
#!/bin/bash
SERVERS=("server1" "server2" "server3")
COMMAND="df -h"
for SERVER in "${SERVERS[@]}"; do
echo "===== $SERVER ====="
ssh $SERVER "$COMMAND"
echo "===================="
done