一、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检査一次磁盘剩余空间。
实现思路
- 同步系统时间(确保定时任务时间准确);
- 配置邮件服务(以 QQ 邮箱为例,实现脚本自动发信);
- 编写监控脚本(提取磁盘剩余空间,判断并触发邮件);
- 设置定时任务(每天执行一次监控脚本)。
1.同步系统时间(基于 chrony)
# 默认已安装,若需要安装则可执行:
[root@server ~]# yum install chrony -y
[root@master ~]# systemctl enable --now chronyd
[root@master ~]# vim /etc/chrony.conf
#将阿里时间服务器配置粘贴其中
server ntp.aliyun.com iburst
stratumweight 0
driftfile /var/lib/chrony/drift
rtcsync
makestep 10 3
bindcmdaddress 127.0.0.1
bindcmdaddress ::1
keyfile /etc/chrony.keys
commandkey 1
generatecommandkey
logchange 0.5
logdir /var/log/chrony
# 重启服务并验证
[root@master ~]# systemctl restart chronyd
[root@master ~]# chronyc sources -v
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current best, '+' = combined, '-' = not combined,
| / 'x' = may be in error, '~' = too variable, '?' = unusable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 203.107.6.88 2 6 7 0 -1686us[-14236m] +/- 34ms
#出现*表示同步成功
2.配置 QQ 邮箱自动发信服务
qq邮箱设置:
开启pop3/SMTP 服务:
复制授权码:
安装邮件服务
[root@server ~]# yum install mailx -y
配置邮件ssl证书
[root@server ~]# mkdir -p /root/.certs
[root@server ~]# cd /root/.certs
[root@server .certs]# echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
[root@server .certs]# certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
[root@backup .certs]# certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
[root@server .certs]# certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt
配置邮件服务
[root@server ~]# vim /etc/mail.rc
# 最后一行添加以下内容:
set from=88888888@qq.com
set smtp=smtps://smtp.qq.com:465 # ssl端口默认465
set smtp-auth-user=88888888@qq.com
set smtp-auth-password=doc****qdubqbibj # 授权码
set smtp-auth=login
set nss-config-dir=/root/.certs/ # 设置证书路径
set ssl-verify=ignore # 启用加密ssl传输
# 注意:该文件输入完毕有的系统需要强制保存退出,输入wq!
测试邮件服务
[root@server ~]# echo "testmail" | mail -s "testmail" 88888888@qq.com
3.编写磁盘监控脚本(warning.sh)
#先查看磁盘空间
[root@master ~]# df -m
文件系统 1M-块 已用 可用 已用% 挂载点
devtmpfs 4 0 4 0% /dev
tmpfs 1688 0 1688 0% /dev/shm
tmpfs 676 9 667 2% /run
tmpfs 4 0 4 0% /sys/fs/cgroup
/dev/mapper/openeuler-root 27039 2046 23595 8% /
tmpfs 1689 0 1689 0% /tmp
/dev/sda1 974 145 762 16% /boot
[root@master ~]# vim warning.sh
#!/bin/bash
#功能:判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,
每天检査一>次磁盘剩余空间。
# 提取根目录剩余空间(单位:MB)
# df -m:以MB为单位显示磁盘信息;grep root:筛选根目录;cut -d " " -f5:提取"可用"列
check_disk=$(df -m | grep root | cut -d " " -f5)
# 判断剩余空间是否小于20G(20000MB)
if (($check_disk>20000))
then
echo "磁盘空间正常,剩余空间:$check_disk MB" | mail -s "磁盘空间正
常" 88888888@qq.com
else
echo "警告!磁盘可用空间不足20G!剩余空间:$check_disk MB ,速处理" | mail -s "告警邮件" 88888888@qq.com
fi
4.设置定时任务(为了方便测试,我改为每分钟检查一次)
[root@master ~]# crontab -e
# 添加以下内容(每分钟执行,如果是每天,举个例子每天0点:0 0 * * *)
* * * * * sh /root/warning.sh
[root@master ~]# crontab -l
* * * * * sh /root/warning.sh
二、判断web服务是否运行(1、查看进程的方式判断该程序是否运行,2、通过查看端口的方式判断该程序是否运行),如果没有运行,则启动该服务并配置防火墙规则。
实现思路
- 检查防火墙状态(确保服务端口可访问);
- 编写脚本:通过
ps
检测进程、netstat
检测端口,判断服务是否运行; - 服务未运行时,自动启动服务并添加防火墙规则。
1.检查防火墙状态是否打开
# 启动防火墙并查看防火墙状态
[root@master ~]# systemctl start firewalld
[root@master ~]# systemctl status firewalld
2.编辑服务是否开启检查脚本
[root@master ~]# vim web_check.sh
#!/bin/bash
#功能:判断web服务是否运行(1、查看进程的方式判断该程序是否运行,2、通过查看端
口的方式判断该程序是否运行),如果没有运行,则启动该服
务并配置防火墙规则
# 读取用户输入:服务名(如nginx)和端口号(如80)
read -p "请输入服务名:" name
read -p "请输入端口号:" port
# 检测服务进程数量(grep -c:统计包含服务名的进程数)
ps_num=$(ps -ef | grep -c $name)
# 检测端口是否被监听(netstat -lntup:显示监听的TCP/UDP端口)
port_num=$(netstat -lntup | grep $port)
# 进程数>1(排除grep自身进程)且端口被监听,说明服务正常
if (($ps_num>1)) && (($port_num>0))
then
echo "$name服务已经启动并且运行!"
else
echo "$name服务未启动,现在启动!"
systemctl enable --now $name
echo "并且配置防火墙规则"
firewall-cmd --permanent --zone=public --add-port=$port/tcp # 永久开放端口
firewall-cmd --reload # 重载防火墙规则
echo "操作完成"
fi
3.测试服务,以nginx为例
#测试进程是否启动
[root@master ~]# ps -ef | grep nginx
root 2242 2012 0 20:38 pts/0 00:00:00 grep --color=auto nginx
# 执行脚本,输入服务名nginx和端口80
[root@master ~]# bash web_check.sh
请输入服务名:nginx
请输入端口号:80
nginx服务未启动,现在启动!
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
并且配置防火墙规则
success
success
操作完成
# 验证服务状态(进程存在)
[root@master ~]# ps -ef | grep nginx
root 2285 1 0 20:40 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 2286 2285 0 20:40 ? 00:00:00 nginx: worker process
nginx 2287 2285 0 20:40 ? 00:00:00 nginx: worker process
root 2303 2012 0 20:41 pts/0 00:00:00 grep --color=auto nginx
# 验证防火墙规则(80/tcp已开放)
[root@master ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens32
sources:
services: dhcpv6-client mdns ssh
ports: 80/tcp # 端口已开放
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
三、使用curl命令访问第二题的web服务,看能否正常访问,如果能正常访问,则返回web serveris running;如果不能正常访问,返回12状态码。
实现思路
- 使用
curl
命令访问 Web 服务默认页面; - 通过$?(上一条命令的退出码)判断访问是否成功(0 为成功,非 0 为失败);
- 成功则输出提示,失败则退出并返回状态码 12。
1.编写脚本(测试上一问nginx服务)
[root@master ~]# vim curl.sh
#!/bin/bash
# 访问Nginx默认页面(/usr/share/nginx/html/index.html),输出重定向到/dev/null(不显示内容)
curl http://localhost/usr/share/nginx/html/index.html &> /dev/null
# 判断curl命令执行结果($?=0表示访问成功)
if (($?==0))
then
echo "web servers is running!" #访问正常
else
exit 12 #访问异常,返回状态码12
fi
2.测试运行
# 服务正常时
[root@master ~]# bash curl.sh
web serveris running!
# 模拟服务异常(如停止Nginx)
[root@master ~]# systemctl stop nginx
[root@master ~]# bash curl.sh
[root@master ~]# echo $?
12
四、总结
回顾这三个 Shell 脚本的实战案例,能清晰感受到运维自动化的核心价值 —— 将重复的人工操作转化为可复用的脚本逻辑,既减少了人为失误,又能让服务器问题在第一时间被察觉和处理。