在企业级开发和运维中,Shell 脚本常用于自动化运维、批量处理、监控报警、部署发布等场景。
一、自动化部署脚本
场景:实现代码拉取、编译、服务重启等部署流程自动化。
示例:Git 拉取代码并重启服务
bash
#!/bin/bash
# 定义变量
APP_DIR="/data/apps/myapp"
GIT_REPO="git@github.com:company/myapp.git"
SERVICE_NAME="myapp.service"
# 拉取最新代码
cd $APP_DIR || exit 1
git pull origin main || {
echo "代码拉取失败!"
exit 1
}
# 编译(若需要)
make clean && make install || exit 1
# 重启服务
systemctl restart $SERVICE_NAME || {
echo "服务重启失败!"
exit 1
}
echo "部署成功!"
企业价值:避免手动操作失误,实现标准化部署,配合 CI/CD 系统(如 Jenkins)使用。
二、日志处理脚本
1. 日志切割(按时间/大小)
场景:避免日志文件过大影响性能,保留历史日志便于排查问题。
bash
#!/bin/bash
# 按天切割 Nginx 日志
LOG_DIR="/var/log/nginx"
TODAY=$(date +"%Y%m%d")
# 停止 Nginx 日志写入(平滑重启)
kill -USR1 $(cat /var/run/nginx.pid)
# 重命名旧日志
mv ${LOG_DIR}/access.log ${LOG_DIR}/access_${TODAY}.log
mv ${LOG_DIR}/error.log ${LOG_DIR}/error_${TODAY}.log
# 清理 7 天前的日志
find ${LOG_DIR} -name "*.log" -mtime +7 -exec rm {} \;
2. 日志统计分析
场景:统计高频访问 IP、错误码(如 404、500)等。
bash
#!/bin/bash
# 统计 Nginx 访问日志中 Top 10 高频 IP
grep -v "^#" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10
# 统计 500 错误次数
grep " 500 " /var/log/nginx/access.log | wc -l
三、监控与报警脚本
1. 进程监控
场景:检测关键服务(如 MySQL、Tomcat)是否存活,异常时重启或报警。
bash
#!/bin/bash
# 监控 Tomcat 进程
PROCESS_NAME="catalina.jar"
PID=$(ps -ef | grep $PROCESS_NAME | grep -v grep | awk '{print $2}')
if [ -z "$PID" ]; then
echo "Tomcat 进程未运行,尝试重启..."
/usr/local/tomcat/bin/startup.sh
# 报警(邮件/短信)
echo "Tomcat 已重启" | mail -s "监控报警" admin@company.com
else
echo "Tomcat 进程运行正常(PID: $PID)"
fi
2. 资源监控(CPU/内存/磁盘)
场景:当服务器资源(如内存使用率 > 80%)超过阈值时报警。
bash
#!/bin/bash
# 内存使用率
MEM_USED=$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2}')
# 磁盘使用率
DISK_USED=$(df -h | awk '$NF=="/"{printf "%.2f%%", $(NF-1)}')
if [ $(echo "$MEM_USED > 80" | bc) -eq 1 ] || [ $(echo "$DISK_USED > 90" | bc) -eq 1 ]; then
echo "内存使用率:$MEM_USED,磁盘使用率:$DISK_USED" | mail -s "服务器资源报警" admin@company.com
fi
四、批量操作脚本
场景:对多台服务器执行相同命令(如更新软件、分发文件)。
示例:批量重启远程服务器服务
bash
#!/bin/bash
# 服务器列表
SERVERS=("192.168.1.100" "192.168.1.101" "192.168.1.102")
for SERVER in "${SERVERS[@]}"; do
echo "------------------- 处理 $SERVER -------------------"
# 免密登录执行命令
ssh root@$SERVER "systemctl restart httpd"
# 检查执行结果
if [ $? -eq 0 ]; then
echo "$SERVER 服务重启成功"
else
echo "$SERVER 服务重启失败"
fi
done
五、定时任务(Cron 脚本)
场景:通过 crontab 实现定时备份、日志清理等无人值守任务。
示例:每日凌晨 2 点备份数据库
bash
#!/bin/bash
# 定义变量
DB_NAME="mydb"
BACKUP_DIR="/data/backup/db"
USER="root"
PASSWORD="password"
DATE=$(date +"%Y%m%d_%H%M%S")
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行备份
mysqldump -u$USER -p$PASSWORD $DB_NAME | gzip > ${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz
# 保留 7 天内的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
配置 Cron:
bash
0 2 * * * /path/to/backup_db.sh
六、服务管理脚本(类似系统服务)
场景:封装自定义服务的启动、停止、重启、状态检查(如 Tomcat、自研服务)。
示例:Tomcat 服务管理脚本(放置于 /etc/init.d/ 或 /usr/lib/systemd/system/ )
bash
#!/bin/bash
# chkconfig: 2345 80 90
# description: Tomcat Service Management
JAVA_HOME="/usr/local/java"
TOMCAT_HOME="/usr/local/tomcat"
PID_FILE="$TOMCAT_HOME/temp/tomcat.pid"
case "$1" in
start)
echo "Starting Tomcat..."
export JAVA_HOME
$TOMCAT_HOME/bin/startup.sh
;;
stop)
echo "Stopping Tomcat..."
$TOMCAT_HOME/bin/shutdown.sh
# 强制终止未停止的进程
if [ -f "$PID_FILE" ]; then
kill -9 $(cat "$PID_FILE")
fi
;;
restart)
$0 stop
$0 start
;;
status)
if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE"); then
echo "Tomcat is running (PID: $(cat "$PID_FILE"))"
else
echo "Tomcat is stopped"
fi
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit 0
七、环境初始化脚本
场景:快速初始化服务器环境(安装依赖、配置参数、创建用户等)。
示例:部署 LNMP 环境
bash
#!/bin/bash
# 安装 Nginx、MySQL、PHP
yum install -y nginx mariadb-server php-fpm php-mysql
# 启动服务并设置开机自启
systemctl start nginx mariadb php-fpm
systemctl enable nginx mariadb php-fpm
# 配置 Nginx 站点
cat > /etc/nginx/conf.d/default.conf <<EOF
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
}
EOF
systemctl restart nginx
八、错误处理与日志记录
企业最佳实践:
1. 脚本开头检查权限:
bash
if [ "$(id -u)" -ne 0 ]; then
echo "Error: 必须使用 root 权限运行!" >&2
exit 1
fi
2. 记录执行日志:
bash
exec &> /var/log/script.log # 将输出重定向到日志文件
3. 捕获异常退出:
bash
trap 'echo "脚本异常退出,错误码:$?"; exit 1' ERR
总结:Shell 在企业中的核心价值
1. 自动化:减少人工操作,降低失误率(如部署、备份、监控)。
2. 标准化:通过脚本统一操作流程,适应多服务器环境。
3. 效率提升:批量处理任务(如数百台服务器的配置同步)。
4. 可维护性:结合版本控制(如 Git)管理脚本,方便迭代。
企业中常将 Shell 脚本与 Ansible、Puppet 等配置管理工具结合,实现更复杂的运维自动化。
7万+

被折叠的 条评论
为什么被折叠?



