Shell 运维基础实战三例

发布于:2025-08-02 ⋅ 阅读:(13) ⋅ 点赞:(0)

一、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检査一次磁盘剩余空间。

实现思路

  1. 同步系统时间(确保定时任务时间准确);
  2. 配置邮件服务(以 QQ 邮箱为例,实现脚本自动发信);
  3. 编写监控脚本(提取磁盘剩余空间,判断并触发邮件);
  4. 设置定时任务(每天执行一次监控脚本)。

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邮箱设置:

image-20230311155808941

  • 开启pop3/SMTP 服务:

image-20230311155846837

  • 复制授权码:

image-20230311155953352

  • 安装邮件服务

[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、通过查看端口的方式判断该程序是否运行),如果没有运行,则启动该服务并配置防火墙规则。

实现思路

  1. 检查防火墙状态(确保服务端口可访问);
  2. 编写脚本:通过ps检测进程、netstat检测端口,判断服务是否运行;
  3. 服务未运行时,自动启动服务并添加防火墙规则。

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状态码。

实现思路

  1. 使用curl命令访问 Web 服务默认页面;
  2. 通过$?(上一条命令的退出码)判断访问是否成功(0 为成功,非 0 为失败);
  3. 成功则输出提示,失败则退出并返回状态码 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 脚本的实战案例,能清晰感受到运维自动化的核心价值 —— 将重复的人工操作转化为可复用的脚本逻辑,既减少了人为失误,又能让服务器问题在第一时间被察觉和处理。


网站公告

今日签到

点亮在社区的每一天
去签到