- 在企业级开发和运维中,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 等配置管理工具结合,实现更复杂的运维自动化。
3676

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



