企业级开发和运维中,Shell 脚本常用于自动化运维、批量处理、监控报警、部署发布等场景。

在企业级开发和运维中,Shell 脚本常用于自动化运维、批量处理、监控报警、部署发布等场景。
 
一、自动化部署脚本
 
场景:实现代码拉取、编译、服务重启等部署流程自动化。
示例:Git 拉取代码并重启服务
 
bash   
#!/bin/bash
# 定义变量
APP_DIR="/data/apps/myapp"
GIT_REPO="[email protected]: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 "监控报警" [email protected]
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 "服务器资源报警" [email protected]
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 < 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 等配置管理工具结合,实现更复杂的运维自动化。

你可能感兴趣的:(运维,linux,自动化)