第一章 Shell脚本运维零基础实战(自动化核心入门)
1.1 Shell脚本生产价值与运维定位
Shell是Linux运维专属自动化语言,无需复杂编程基础,主打简单、高效、落地 。企业运维90%的轻量化自动化工作(自动备份、自动清理日志、自动巡检、服务监控、批量操作)全部依靠Shell脚本实现,是零基础运维进阶的核心分水岭。
相比于手动敲命令:手动操作耗时、易出错、无法持续复用;Shell脚本一次编写、永久复用、定时执行、批量生效,是运维摆脱重复劳作、实现自动化上岗的必备技能。
1.2 脚本运行原理与生产规范
1.2.1 脚本解释器
系统默认解释器为bash,所有运维脚本统一首行声明,固定标准:#!/bin/bash,作用是指定脚本由bash解释器执行,避免系统默认解释器导致语法报错。
1.2.2 生产脚本命名规范
-
脚本后缀统一为 .sh,辨识度高、行业通用;
-
命名语义化:backup_project.sh、clean_log.sh、server_check.sh,禁止随意命名;
-
生产脚本统一存放目录:/usr/local/scripts/,集中管理、方便调用;
-
所有脚本必须添加执行权限,禁止无权限运行。
1.2.3 脚本运行三种方式(生产区分使用)
bash
# 方式1:bash 脚本名(无需执行权限,测试调试首选)
bash test.sh
# 方式2:sh 脚本名(通用兼容,双系统均可使用)
sh test.sh
# 方式3:./脚本名(必须有执行权限,生产正式运行标准)
chmod +x test.sh
./test.sh
1.2.4 生产脚本通用禁忌
-
脚本内所有路径必须使用绝对路径,规避定时任务执行失效问题;
-
禁止脚本内使用777权限、禁止裸删文件命令;
-
重要操作脚本必须加日志输出,方便故障回溯;
-
脚本编写完成先调试,再放入定时任务,避免线上事故。
第二章 Shell脚本基础语法(运维专用·极简落地)
2.1 变量定义与实战使用
运维脚本无需复杂变量,仅需掌握自定义变量、系统内置变量,满足100%运维场景。
2.1.1 自定义变量
bash
#!/bin/bash
# 定义变量(等号左右无空格,严格规范)
PROJECT_DIR="/opt/project"
BACKUP_DIR="/home/backup"
DATE=$(date +%Y%m%d)
# 调用变量
echo "项目路径:$PROJECT_DIR"
echo "备份日期:$DATE"
2.1.2 运维高频系统内置变量
$0:脚本本身名称
1、2:脚本后接第一、第二个传参(批量运维核心)
$#:传参总个数
$$:脚本运行PID
$?:上一条命令执行返回状态(0成功、非0失败,排错必备)
bash
#!/bin/bash
echo "脚本名称:$0"
echo "第一个参数:$1"
echo "执行状态:$?"
2.2 条件判断语句(脚本智能判断核心)
生产脚本核心用途:判断目录是否存在、服务是否启动、文件是否存在、磁盘是否爆满。
2.2.1 文件目录判断(最高频)
bash
#!/bin/bash
# 判断目录不存在则创建
if [ ! -d "/opt/project/log" ];then
mkdir -p /opt/project/log
fi
# 判断文件存在则删除
if [ -f "/opt/project/test.log" ];then
rm -f /opt/project/test.log
fi
-d 判断目录、-f 判断文件、! 取反(不存在/不成立)
2.2.2 服务状态判断(监控必备)
bash
#!/bin/bash
# 判断Nginx是否运行,未运行则重启
ps -ef | grep nginx | grep -v grep
if [ $? -ne 0 ];then
systemctl restart nginx
echo "Nginx服务异常,已重启!"
fi
2.3 循环语句(批量运维核心)
for循环是运维批量操作神器:批量创建文件、批量删除日志、批量修改配置、批量巡检主机。
bash
#!/bin/bash
# 批量清理30天过期日志
for file in $(find /var/log -name "*.log" -mtime +30)
do
rm -f $file
echo "已清理过期日志:$file"
done
第三章 运维高频Shell实战脚本(可直接上线复用)
本章所有脚本生产直接可用、双系统兼容,无需修改可直接放入定时任务,覆盖备份、清理、巡检、监控四大核心场景。
3.1 项目自动备份脚本(企业标准)
功能:自动按日期打包备份、避免覆盖、输出备份日志、容错处理
bash
#!/bin/bash
# 环境变量配置
PROJECT_PATH="/opt/project"
BACKUP_PATH="/home/backup"
DATE=$(date +%Y%m%d)
BACKUP_FILE="$BACKUP_PATH/project-$DATE.tar.gz"
# 创建备份目录
mkdir -p $BACKUP_PATH
# 打包备份
tar -zcvf $BACKUP_FILE $PROJECT_PATH >/dev/null 2>&1
# 判断备份结果
if [ $? -eq 0 ];then
echo "$DATE 项目备份成功,文件:$BACKUP_FILE" >> $BACKUP_PATH/backup_log.log
else
echo "$DATE 项目备份失败" >> $BACKUP_PATH/backup_error.log
fi
3.2 自动清理日志脚本(磁盘防爆满)
功能:自动清理15天过期日志、临时文件,释放磁盘空间,杜绝磁盘爆满故障
bash
#!/bin/bash
# 清理15天过期日志与临时文件
find /var/log /tmp /opt/project/log -name "*.log" -mtime +15 -delete
find /tmp -type f -mtime +15 -delete
echo "$(date +%Y-%m-%d) 过期日志清理完成" >> /var/log/clean_log.log
3.3 服务器日常巡检脚本(自动化巡检)
功能:自动检测磁盘使用率、内存负载、端口状态、系统报错,输出巡检报告
bash
#!/bin/bash
LOG_FILE="/var/log/server_check.log"
echo "==========$(date +%Y-%m-%d) 服务器巡检报告==========" >> $LOG_FILE
echo "【磁盘空间状态】" >> $LOG_FILE
df -h | grep -v tmpfs >> $LOG_FILE
echo "【内存负载状态】" >> $LOG_FILE
free -h >> $LOG_FILE
echo "【系统报错信息】" >> $LOG_FILE
grep -i error /var/log/messages >> $LOG_FILE
echo "==================================================" >> $LOG_FILE
3.4 服务宕机自动重启脚本(线上保活)
适配Nginx、Java、Redis、MySQL等所有服务,实现服务宕机自动拉起,保障业务不中断
bash
#!/bin/bash
# 监控Nginx服务,异常自动重启
SERVICE_NAME="nginx"
ps -ef | grep $SERVICE_NAME | grep -v grep
if [ $? -ne 0 ];then
systemctl restart $SERVICE_NAME
echo "$(date +%Y-%m-%d) $SERVICE_NAME 服务宕机,已自动重启" >> /var/log/service_monitor.log
fi
第四章 脚本定时自动化落地(Crontab+Shell联动)
4.1 脚本标准化部署流程
1、统一上传脚本至 /usr/local/scripts/ 目录;
2、添加执行权限:chmod +x *.sh;
3、手动执行调试,确认无报错;
4、写入crontab定时任务,实现全自动运行。
4.2 生产定时任务落地配置
bash
# 每日凌晨2点自动备份项目
0 2 * * * /usr/local/scripts/backup_project.sh
# 每日凌晨3点自动清理日志
0 3 * * * /usr/local/scripts/clean_log.sh
# 每小时自动巡检服务器
0 * * * * /usr/local/scripts/server_check.sh
# 每10分钟监控服务状态
*/10 * * * * /usr/local/scripts/nginx_monitor.sh
第五章 Shell脚本高频报错与生产避坑指南
5.1 脚本手动执行成功,定时任务执行失败
根因 :定时任务无系统环境变量、脚本使用相对路径、命令未写绝对路径
解决方案 :脚本内所有路径、命令全部绝对路径,脚本头部导入环境变量 source /etc/profile
5.2 脚本权限不足无法执行
根因 :未添加执行权限、文件归属错误
修复:chmod +x 脚本名 && chown root:root 脚本名
5.3 循环遍历文件为空、执行无效果
根因 :路径错误、文件不存在、语法空格不规范
修复:严格检查路径,shell语法中括号、判断语句必须保留空格
5.4 脚本输出乱码、格式错误
根因 :Windows编辑脚本上传导致换行符异常
修复 :安装dos2unix,转换脚本格式 dos2unix 脚本名
第六章 双系统Shell脚本兼容差异(CentOS/Ubuntu)
绝大多数基础脚本双系统通用,仅以下细微差异需要注意:
1、系统服务命令:CentOS兼容旧service命令,Ubuntu仅支持systemctl;
2、日志路径差异:安全日志路径不同,巡检脚本需区分配置;
3、软件安装命令差异,自动化安装脚本需区分系统;
4、Ubuntu对脚本语法、空格、换行符校验更严格,需更规范编写。