哪些实用脚本适合Linux系统管理员?10个必备自动化工具详解
📖 目录导读
为什么系统管理员需要脚本自动化?
在Linux运维中,重复性任务(如检查磁盘使用率、批量添加用户、清理过期日志)会消耗大量时间,据统计,一位熟练的系统管理员每天可能花费30%的时间在手动操作上,而通过脚本自动化,可以将时间缩短到几分钟,同时降低人为错误风险。

典型场景:一个拥有200台服务器的集群,如果每天手动执行df -h检查磁盘,至少需要2小时;而运行一个监控脚本,只需5分钟生成报告并发送告警。
10个实用脚本类型及示例
1 系统健康监控脚本
功能:CPU、内存、负载、进程数、连接数综合监控,异常时发送邮件/Slack通知。
#!/bin/bash
# system_health.sh - 检查系统关键指标
CPU_THRESHOLD=80
MEM_THRESHOLD=80
DISK_THRESHOLD=90
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d% -f1)
mem_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
disk_usage=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')
if (( $(echo "$cpu_usage > $CPU_THRESHOLD" | bc) )); then
echo "CPU警告: ${cpu_usage}%"
# 发送告警...
fi
2 日志轮转与清理脚本
问题:系统日志(如/var/log/syslog)可能迅速膨胀至GB级别,导致磁盘写满。
#!/bin/bash
# log_cleaner.sh - 保留最近7天日志,压缩旧日志
LOG_DIR="/var/log"
RETENTION_DAYS=7
find $LOG_DIR -name "*.log" -type f -mtime +$RETENTION_DAYS -exec gzip {} \;
find $LOG_DIR -name "*.gz" -type f -mtime +30 -delete
3 批量用户管理脚本
场景:为新员工入职创建100个账号,包含主目录、SSH密钥、组权限。
#!/bin/bash # batch_users.sh - 从CSV文件批量创建用户 INPUT_FILE="users.csv" while IFS=',' read -r username group shell do useradd -m -s "$shell" -g "$group" "$username" mkdir -p /home/$username/.ssh echo "密钥内容" > /home/$username/.ssh/authorized_keys chown -R $username:$group /home/$username done < "$INPUT_FILE"
4 备份与恢复脚本
核心逻辑:使用rsync增量备份到远程主机,保留最近30天版本。
#!/bin/bash # backup.sh - 增量备份至远程服务器 SOURCE_DIR="/data" REMOTE_USER="backupuser" REMOTE_HOST="192.168.1.100" REMOTE_DIR="/backup/$(hostname)" rsync -avz --delete --link-dest=$REMOTE_DIR/latest "$SOURCE_DIR" $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$(date +%Y%m%d) ssh $REMOTE_USER@$REMOTE_HOST "cd $REMOTE_DIR && ln -snf $(date +%Y%m%d) latest"
5 磁盘空间告警脚本
实现:遍历所有挂载点,当使用率超过阈值时发送邮件。
#!/bin/bash
# disk_alert.sh
THRESHOLD=85
df -h | grep -vE 'tmpfs|cdrom' | while read line
do
usage=$(echo $line | awk '{print $5}' | sed 's/%//')
mount_point=$(echo $line | awk '{print $6}')
if [ $usage -ge $THRESHOLD ]; then
echo "磁盘 $mount_point 使用率: ${usage}% - 超过阈值${THRESHOLD}%" | mail -s "磁盘告警" admin@example.com
fi
done
6 网络连通性检测脚本
功能:定期Ping核心服务(数据库、Web服务器),失败时自动重启服务或切换至备用IP。
#!/bin/bash
# network_check.sh
WEB_SERVER="10.0.0.2"
DB_SERVER="10.0.0.3"
for server in $WEB_SERVER $DB_SERVER; do
if ! ping -c2 $server &>/dev/null; then
echo "$server 不可达,尝试重启网络服务..."
systemctl restart networking
fi
done
7 自动更新与补丁管理脚本
注意:生产环境建议分批次进行,并回滚机制。
#!/bin/bash # security_update.sh - 安全补丁自动安装 yum update --security -y || apt update && apt upgrade -y 2>/dev/null # 记录变更日志 echo "$(date) - 安全更新完成" >> /var/log/auto_patch.log # 如果是内核更新,安排重启 if needs-restarting -r; then shutdown -r +5 "内核已更新,5分钟后重启" fi
8 服务状态监控与重启脚本
场景:防止Nginx或MySQL挂掉影响业务。
#!/bin/bash
# service_watchdog.sh
SERVICES=("nginx" "mysql" "redis")
for svc in "${SERVICES[@]}"; do
if ! systemctl is-active --quiet $svc; then
echo "$svc 挂了,尝试重启..." | systemd-cat -t watchdog
systemctl restart $svc
# 如果重启失败,发送严重告警
sleep 5
if ! systemctl is-active --quiet $svc; then
echo "严重: $svc 重启失败" | mail -s "服务故障" ops@company.com
fi
fi
done
9 文件一致性校验脚本
用途:监控关键配置文件/二进制是否被篡改(合规审计必备)。
#!/bin/bash # integrity_check.sh MANIFEST_FILE="/etc/security/manifest.txt" # 生成当前文件哈希 find /etc /bin /sbin -type f | xargs md5sum > /tmp/current_manifest.txt # 对比基线 diff $MANIFEST_FILE /tmp/current_manifest.txt | grep "^<" | while read line; do echo "文件被修改: $line" done
10 容器与Docker管理脚本
功能:批量更新镜像、清理无用容器和镜像、导出日志。
#!/bin/bash # docker_housekeeping.sh # 删除已停止的容器 docker container prune -f # 删除悬空镜像 docker image prune -f # 清理超过7天的容器日志 docker logs --tail 1000 container_name > /var/log/docker/container_$(date +%Y%m%d).log
脚本编写最佳实践
✅ 错误处理:使用set -e在遇到错误时立即退出,或使用trap捕获退出信号。
✅ 日志记录:所有脚本操作应记录时间、执行结果到/var/log/。
✅ 幂等性:确保脚本多次运行不会引发副作用(如重复创建用户)。
✅ 参数化:通过命令行参数(如--dry-run)控制执行模式。
✅ 定时调度:使用crontab或systemd timer,例如每天凌晨3点执行磁盘检查:
0 3 * * * /usr/local/bin/disk_alert.sh
常见问题问答(FAQ)
Q1:脚本中如何安全地存储密码或密钥?
A:避免硬编码!使用环境变量(如export DB_PASS=xxx)或从Vault(如HashiCorp Vault)获取,或在脚本中使用read -s交互式输入。
Q2:如何防止脚本在生产环境中误操作?
A:在脚本开头添加set -u(检测未定义变量)和set -o pipefail,同时实现--dry-run模式,只输出将要执行的内容。
Q3:脚本执行超时怎么办?
A:使用timeout命令包裹关键操作,timeout 30 rsync ...,若30秒未完成则结束进程。
Q4:如何让脚本支持多机批量执行?
A:结合pdsh、ansible或parallel-ssh。pdsh -w server[01-50] /opt/scripts/disk_check.sh
Q5:监控脚本产生的告警如何避免重复通知?
A:实现“去抖”逻辑:记录上次告警时间,仅在间隔超过30分钟时再次发送;或使用状态文件记录当前问题是否未解决。