前言

​ 在 Linux 系统运维中,自动化脚本是提升效率的核心工具。无论是定期的资源巡检,还是服务的自动故障恢复,都离不开 SHELL 脚本的支持。

​ 本次实验旨在通过编写一个综合性的 SHELL 脚本,解决服务器日常维护中的三个典型场景:

  1. 磁盘空间预警:防止因磁盘写满导致服务宕机。
  2. Web 服务守护:确保关键业务进程在线,并自动处理防火墙规则。
  3. 可用性验证:模拟客户端请求,验证服务是否真正可用。

本文将详细拆解这三个需求的实现逻辑,并提供完整的代码示例。

一、实验环境准备:openEuler 虚拟机搭建

​ 工欲善其事,必先利其器。本次实验我们需要一台运行 openEuler 22.03 LTS SP4 的 Linux 虚拟机。以下是详细的搭建步骤。

  1. 获取镜像与虚拟化软件

  • 网址:https://www.openeuler.org/zh/download/archive/
  • 版本选择:openEuler 22.03 LTS SP4 ,即长期更新版
  1. 创建虚拟机

    打开 VMware,选择“创建新的虚拟机”,按照以下参数进行配置:
  • 典型配置:选择“典型(推荐)”。
    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

  • 硬件配置:

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

    启动虚拟机,进入安装界面:

  • 语言选择:推荐选择“中文”或“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 环境下,成功构建了一套基础的自动化运维脚本体系:

  1. 磁盘监控利用了 dfmailx,保障了存储安全。
  2. 服务守护结合了 pssssystemctl,实现了故障自愈。
  3. 健康检查利用 curl 模拟真实用户行为,确保了业务可用性。

进阶思考:

  • 如何将这三个脚本合并为一个主脚本,通过参数调用不同功能?
  • 如何引入日志轮转(logrotate)防止日志文件过大?
  • 如何利用 Python 或 Go 重构这些 Shell 脚本以适应更复杂的微服务架构?

希望这篇实战指南能为你的 openEuler 学习之路提供帮助!如果觉得有用,欢迎点赞收藏!

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐