别再用眼睛盯服务器了!教你用 SHELL 脚本全自动巡检与故障恢复
前言
在 Linux 系统运维中,自动化脚本是提升效率的核心工具。无论是定期的资源巡检,还是服务的自动故障恢复,都离不开 SHELL 脚本的支持。
本次实验旨在通过编写一个综合性的 SHELL 脚本,解决服务器日常维护中的三个典型场景:
- 磁盘空间预警:防止因磁盘写满导致服务宕机。
- Web 服务守护:确保关键业务进程在线,并自动处理防火墙规则。
- 可用性验证:模拟客户端请求,验证服务是否真正可用。
本文将详细拆解这三个需求的实现逻辑,并提供完整的代码示例。
一、实验环境准备:openEuler 虚拟机搭建
工欲善其事,必先利其器。本次实验我们需要一台运行 openEuler 22.03 LTS SP4 的 Linux 虚拟机。以下是详细的搭建步骤。
- 网址:https://www.openeuler.org/zh/download/archive/
- 版本选择:openEuler 22.03 LTS SP4 ,即长期更新版
-
典型配置:选择“典型(推荐)”。

-
安装来源:选择“安装程序光盘映像文件 (iso)”,浏览并选中刚才下载的 openEuler ISO 文件。

-
客户机操作系统:选择 Linux -> Other Linux 5.x kernel 64-bit(如果列表中没有 openEuler 选项,选这个最接近)。

-
硬件配置:
- 内存:建议分配 2GB 或以上,保证编译和运行流畅。
- 处理器:1 核或 2 核即可。
- 硬盘:建议分配 20GB - 40GB。注意:为了测试任务 1 中的“剩余空间小于 20G”报警功能,如果你分配的硬盘很大,后续可能需要手动创建大文件来填充空间进行测试。
- 网络适配器:选择 NAT 模式,方便虚拟机共享宿主机的网络上网下载软件包。
-
语言选择:推荐选择“中文”或“English”。

-
安装位置:选择自动分区(Automatic Partitioning),点击“完成”。

-
ROOT 密码:务必设置一个简单的 root 密码(如 123456),方便后续实验操作。

-
创建用户:用户名、用户密码

-
网络和主机名:打开网卡连接

-
开始安装:点击“开始安装”,等待进度条走完。
-
重启:安装完成后,重启系统并使用 root 账号登录。

提示:登录成功后,建议先执行 ping baidu.com 测试网络连通性。如果无法上网,请检查 VMware 的 NAT 服务是否开启,或尝试在虚拟机设置中重新插拔一下网卡。
二、任务 1:磁盘剩余空间监控与告警
需求分析
我们需要编写一段逻辑,每天检查一次磁盘。如果根目录 / 的剩余空间小于 20GB,就发送邮件给管理员。
1.环境依赖安装
要实现邮件发送,我们需要安装 mailx工具。在 openEuler 中执行:
[root@master ~]# yum install mailx -y
2.配置邮件服务(mailx)
证书制作
[root@master ~]# mkdir -p /root/.certs
[root@master ~]# cd /root/.certs/
[root@master .certs]# echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-ENDCERTIFICATE-/p' > ~/.certs/qq.crt
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root G2
verify return:1
depth=1 C = US, O = "DigiCert, Inc.", CN = DigiCert Secure Site OV G2 TLS CN RSA4096 SHA256 2022 CA1
verify return:1
depth=0 C = CN, ST = Guangdong Province, L = Shenzhen, O = Shenzhen Tencent Computer Systems Company Limited, CN = *.mail.qq.com
verify return:1
DONE
[root@master .certs]# certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
[root@master .certs]# certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
[root@master .certs]# certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt
Notice: Trust flag u is set automatically if the private key is present.
编辑配置文件 /etc/mail.rc
[root@master .certs]# vim /etc/mail.rc
#在文件末尾添加以下内容
set from=3391747216@qq.com # 发件人地址
set smtp=smtps://smtp.qq.com:465 # SMTP服务器地址
set smtp-auth-user=3391747216@qq.com # 登录账号
set smtp-auth-password=uhuc********dahg # 邮箱授权码(非登录密码)
set smtp-auth=login # 认证方式
set nss-config-dir=/root/.certs
set ssl-verify=ignore
注意: QQ 邮箱需要在设置中开启 POP3/SMTP 服务并获取授权码。
进行测试
[root@master .certs]# echo "testmail" | mail -s "testmail" 3391747216@qq.com

3.脚本实现
[root@master bash]# vim test1.sh
#!/bin/bash
disk=$(df -m | grep -w / | tr -s " " | cut -d " " -f4)
if (($disk<20000))
then
echo "Warning : disk space less than 20G!" | mail -s "告警邮件:磁盘剩余容量不足20G!" 3391747216@qq.com
fi
[root@master bash]# bash test1.sh

4.设置定时任务
[root@master ~]# vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
0 8 0 0 0 root /bin/bash /bash/test1.sh
三、任务 2:Web 服务状态判断与自动修复
需求分析
我们需要双重确认 Web 服务(httpd)是否在运行:
- 查进程:看有没有 httpd 进程。
- 查端口:看 80 端口是否在监听。
如果都没运行,说明服务挂了,需要启动它,并确保防火墙放行了 80 端口。
1.环境依赖安装
[root@master ~]# systemctl enable --now firewalld
[root@master ~]# dnf install nginx -y
2.脚本实现
[root@master ~]# vim /bash/test2.sh
#!/bin/bash
num_ps=$(ps -ef | grep -c [n]ginx)
if (($num_ps>0))
then
echo "nginx if already running"
else
echo "nginx not start,waiting..."
yum install nginx -y &> /dev/null
systemctl start nginx &> /dev/null
firewall-cmd --permanent --zone=public --add-service=http &> /dev/null
firewall-cmd --permanent --zone=public --add-port=80/tcp &> /dev/null
firewall-cmd --reload &> /dev/null
echo "nginx if already running!!!"
fi
[root@master bash]# bash test2.sh
nginx if already running
[root@master bash]# yum remove nginx -y
[root@master bash]# bash test2.sh
nginx not start,waiting...
nginx if already running!!!
[root@master bash]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2026-06-05 18:18:25 CST; 5min ago
Process: 3243 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
Process: 3246 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
Process: 3249 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
Main PID: 3250 (nginx)
Tasks: 5 (limit: 21404)
Memory: 3.7M
CGroup: /system.slice/nginx.service
├─ 3250 "nginx: master process /usr/sbin/nginx"
├─ 3251 "nginx: worker process"
├─ 3252 "nginx: worker process"
├─ 3254 "nginx: worker process"
└─ 3255 "nginx: worker process"
Jun 05 18:18:25 master systemd[1]: Starting The nginx HTTP and reverse proxy server...
Jun 05 18:18:25 master nginx[3246]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Jun 05 18:18:25 master nginx[3246]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Jun 05 18:18:25 master systemd[1]: Started The nginx HTTP and reverse proxy server.
四、任务 3:Curl 可用性验证
需求分析
服务启动了不代表能用(比如可能卡在启动中,或者配置错误返回 500)。我们需要用 curl 模拟浏览器访问。
- 成功:返回 “web server is running”。
- 失败:返回退出状态码 12(通常表示连接失败或超时)。
[root@master bash]# vim test3.sh
#!/bin/bash
check_ip=$(hostname -I)
curl $check_ip &> /dev/null
if (($?==0))
then
echo "web server is running"
else
echo "web server is not running"
exit 12
fi
[root@master bash]# bash test3.sh
web server is running
[root@master bash]# systemctl stop nginx
[root@master bash]# bash test3.sh
web server is not running
[root@master bash]# bash test2.sh
nginx not start,waiting...
nginx if already running!!!
[root@master bash]# bash test3.sh
web server is running
[root@master bash]#
五、总结与展望
通过本次实验,我们在 openEuler-22.03-LTS-SP4 环境下,成功构建了一套基础的自动化运维脚本体系:
- 磁盘监控利用了
df和mailx,保障了存储安全。 - 服务守护结合了
ps、ss和systemctl,实现了故障自愈。 - 健康检查利用
curl模拟真实用户行为,确保了业务可用性。
进阶思考:
- 如何将这三个脚本合并为一个主脚本,通过参数调用不同功能?
- 如何引入日志轮转(logrotate)防止日志文件过大?
- 如何利用 Python 或 Go 重构这些 Shell 脚本以适应更复杂的微服务架构?
希望这篇实战指南能为你的 openEuler 学习之路提供帮助!如果觉得有用,欢迎点赞收藏!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)