Skip to content

Shell 脚本案例汇总

本页整理了一些常见的 Shell 脚本案例,适合用于日常运维工作中的自动化处理任务。


案例一:Linux 系统巡检脚本

脚本用途:快速检查系统的基本信息、硬件资源、服务状态和安全配置。

脚本内容:

shell
#!/bin/bash
echo '系统巡检开启'

echo '---------------------- 1. 系统信息检查 ----------------------'
# 暂时修改语言和字符集
export LANG=en_US.UTF-8

# 主机名
zhuji_ming=$(cat /etc/hostname)
echo "主机名: $zhuji_ming"

# IP
benji_ip=$(hostname -I)
echo "IP 地址: $benji_ip"

# 系统发行版本
xitong_release=$(cat /etc/os-release | grep PRE | awk -F '"' '{ print $2 }')
echo "系统发行版本: $xitong_release"

# 系统具体版本
juti_neihe=$(cat /etc/os-release | grep -w VERSION | awk -F '"' '{ print $2 }')
echo "系统具体版本: $juti_neihe"

# 内核版本
kernel=$(uname -r)
echo "内核版本: $kernel"

# 系统语言和字符集
lang_zifuji=$(echo $LANG)
echo "系统语言和字符集: $lang_zifuji"

echo '---------------------- 2. 硬件信息检查 ----------------------'
# CPU架构
cpu_jiagou=$(uname -i)
echo "CPU架构: $cpu_jiagou"

# CPU版本
cpu_banben=$(cat /proc/cpuinfo | grep -w "model name" | sed -n '1p' | awk -F ':' '{ print $2 }' | xargs)
echo "CPU版本: $cpu_banben"

# CPU插槽数
cpu_socket=$(lscpu | grep Socket | awk -F: '{ print $2 }' | xargs)
echo "CPU插槽数: $cpu_socket"

# CPU核心数
cpu_hexin=$(lscpu | grep "CPU(s)" | sed -n 1p | awk -F: '{ print $2 }' | xargs)
echo "CPU核心数: $cpu_hexin"

echo '---------------------- 3. 内存与交换空间检查 ----------------------'
# 总内存
mem_zongti=$(cat /proc/meminfo | grep -w MemTotal | awk -F: '{ print $2 }' | xargs)
echo "总内存: $mem_zongti"

# 可用内存
mem_wanquankeyong=$(cat /proc/meminfo | grep -w MemAvailable | awk -F: '{ print $2 }' | xargs)
echo "可用内存: $mem_wanquankeyong"

# 已用内存
yiyong_neicun=$(free -h | grep Mem | awk '{ print $3 }')
echo "已用内存: $yiyong_neicun"

# SWAP空间
swap_daxiao=$(free -h | grep Swap | awk '{print $2}')
swap_shiyong=$(free -h | grep Swap | awk '{print $3}')
swap_shengyu=$(free -h | grep Swap | awk '{print $4}')
echo "SWAP大小: $swap_daxiao, 使用情况: $swap_shiyong, 剩余: $swap_shengyu"

echo '---------------------- 4. 磁盘检查 ----------------------'
# 磁盘个数
cipan_total=$(fdisk -l | egrep '^(\/dev\/sda|\/dev\/vda)' | wc -l)
echo "磁盘总数: $cipan_total"

# 磁盘大小
cipan_daxiao=$(fdisk -l | sed -n 1p | awk -F: '{ print $2 }')
echo "磁盘大小: $cipan_daxiao"

# 磁盘分区使用情况
cipan_fenqudaxiao=$(df -h | grep ' /$' | awk '{print "磁盘大小: " $2 ", 磁盘已用: " $3 ", 磁盘可以: " $4}')
echo "磁盘分区使用情况: $cipan_fenqudaxiao"

# 磁盘分区inode使用率
cipan_inode=$(df -ih | grep '/$' | awk '{ print $(NF-1) }')
echo "磁盘分区inode使用率: $cipan_inode"

echo '---------------------- 5. 负载与性能检查 ----------------------'
# 负载均衡1,5,15
one_load=$(uptime | awk -F 'load average: ' '{print $2}' | awk -F, '{print $1}' | xargs)
five_load=$(uptime | awk -F 'load average: ' '{print $2}' | awk -F, '{print $2}' | xargs)
onefive_load=$(uptime | awk -F 'load average: ' '{print $2}' | awk -F, '{print $3}' | xargs)
echo "负载均衡: 1分钟负载: $one_load, 5分钟负载: $five_load, 15分钟负载: $onefive_load"

echo '---------------------- 6. 用户与登录信息检查 ----------------------'
# 总用户数量
yonghu_total=$(cat /etc/passwd | wc -l)
echo "总用户数量: $yonghu_total"

# 可登录用户数量
kedenglu_total=$(cat /etc/passwd | grep /bin/bash | wc -l)
echo "可登录用户数量: $kedenglu_total"

# 虚拟用户数量
yonghu_xuni=$(cat /etc/passwd | egrep -v 'sh$' | wc -l)
echo "虚拟用户数量: $yonghu_xuni"

# 可登录用户名称
kedenglu_name=$(cat /etc/passwd | egrep 'sh$' | awk -F: '{ print $1}')
echo "可登录用户名称: $kedenglu_name"

echo '---------------------- 7. 网络配置检查 ----------------------'
# DNS配置和可用性
dns_what=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
dns_keyong=$(ping www.jd.com -c 1 &>/dev/null; echo $?)
if [ $dns_keyong -eq 0 ]; then
    echo "DNS可用: $dns_what"
else
    echo "DNS不可用"
fi

echo '---------------------- 8. 服务与进程检查 ----------------------'
# 服务进程状态
ps_nginx=$(systemctl is-active nginx)
if [ "$ps_nginx" == "active" ]; then
    echo "Nginx服务正在运行"
else
    echo "Nginx服务未运行"
fi

ps_sql=$(systemctl is-active mysql)
if [ "$ps_sql" == "active" ]; then
    echo "MySQL服务正在运行"
else
    echo "MySQL服务未运行"
fi

ps_sshd=$(systemctl is-active sshd)
if [ "$ps_sshd" == "active" ]; then
    echo "SSHD服务正在运行"
else
    echo "SSHD服务未运行"
fi

# 僵尸进程数量
ps_zombie_number=$(ps -aux | awk 'NR>1' | awk '{print $7}' | grep Z | wc -l)
if [ "$ps_zombie_number" -gt 0 ]; then
    echo "存在僵尸进程: $ps_zombie_number 个"
else
    echo "没有僵尸进程"
fi

echo '---------------------- 9. 系统服务状态检查 ----------------------'
# 防火墙状态
fire_panduan=$(systemctl is-active iptables)
if [ "$fire_panduan" == "active" ]; then
    echo "防火墙已启用"
else
    echo "防火墙未启用"
fi

# SELinux 状态
selinux_panduan=$(getenforce)
echo "SELinux状态: $selinux_panduan"

# 启用的服务
systemctl_enable=$(systemctl list-unit-files | grep enabled | awk '{print $1}')
echo "启用的服务: $systemctl_enable"

# 是否有备份任务
beifen_panduan=$(crontab -l | grep backup | echo $?)
if [ $beifen_panduan -eq 0 ]; then
    echo "有备份任务"
else
    echo "没有备份任务"
fi

# 时间同步任务是否存在
time_panduan=$(crontab -l | grep ntpdate | echo $?)
if [ $time_panduan -eq 0 ]; then
    echo "存在时间同步任务"
else
    echo "没有时间同步任务"
fi

echo '---------------------- 10. 防火墙与安全检查 ----------------------'
# 系统防火墙
firewalld_panduan=$(systemctl is-active firewalld)

if [[ "$firewalld_panduan" == 'inactive' ]]; then
    echo '防火墙未开启'
else
    echo '防火墙已经开启'
fi

# 系统 SELinux
selinux_panduan=$(getenforce)
echo "SELinux状态: $selinux_panduan"

# 系统 sshd 检查
ssh_file=/etc/ssh/sshd_config
ssh_prot_jiancha=$(cat $ssh_file | egrep -v '^$|#' | grep port | awk '{print $2}')
ssh_root_jiancha=$(grep "^PermitRootLogin" $ssh_file | awk '{print $2}')
ssh_passwrod_jiancha=$(grep "^PasswordAuthentication" $ssh_file | awk '{print $2}')

if [[ "$ssh_prot_jiancha" -eq 22 ]]; then
    echo "端口为默认,容易被攻击"
fi

if [[ "$ssh_root_jiancha" == "yes" ]]; then
    echo "root允许远程登陆"
else
    echo "root不允许远程登陆"
fi

if [[ "$ssh_passwrod_jiancha" == "yes" ]]; then
    echo "root允许密码登陆"
else
    echo "root不允许密码登陆"
fi

# 系统日志检查
system_log_status=$(journalctl -p 3 -n 10 | grep Failed | wc -l)

if [[ "$system_log_status" -eq 0 ]]; then
    echo "系统日志错误: 无错误"
else
    echo "系统日志错误: 存在错误"
fi

echo '巡检结束 请检查失败的地方'

# 建议保存为 check_system.sh 并赋予执行权限: chmod +x check_system.sh

案例二:一键备份网站目录与数据库

脚本用途:对网站文件和 MySQL 数据库进行自动压缩备份。

shell
#!/bin/bash

# 设置变量
backup_dir="/backup/$(date +%F)"
web_dir="/var/www/html"
db_user="root"
db_pass="yourpassword"
db_name="yourdb"

# 创建备份目录
mkdir -p "$backup_dir"

# 备份网站文件
tar -czf "$backup_dir/webfiles.tar.gz" "$web_dir"

# 备份数据库
mysqldump -u"$db_user" -p"$db_pass" "$db_name" > "$backup_dir/db.sql"

echo "备份完成,保存于:$backup_dir"

案例三:检查服务是否存活并自动拉起

脚本用途:定时检查服务是否运行,如果未运行则自动启动。

shell
bash


复制编辑
#!/bin/bash

service_name="nginx"

if ! pgrep -x "$service_name" > /dev/null; then
    echo "$service_name 未运行,尝试启动..."
    systemctl start "$service_name"
    sleep 1
    if pgrep -x "$service_name" > /dev/null; then
        echo "$service_name 启动成功"
    else
        echo "$service_name 启动失败"
    fi
else
    echo "$service_name 正在运行"
fi

案例四:清理系统日志和缓存

脚本用途:释放磁盘空间,清理旧日志与缓存文件。

shell
#!/bin/bash

echo "开始清理..."

# 清理日志
find /var/log -type f -name "*.log" -exec truncate -s 0 {} \;

# 清理 apt 缓存
apt-get clean

# 清理缓存
rm -rf /var/cache/* /tmp/*

echo "清理完成"

案例五:批量修改文件权限

脚本用途:递归修改目录中文件和目录的权限。

shell
#!/bin/bash

target_dir="/your/path"

find "$target_dir" -type f -exec chmod 644 {} \;
find "$target_dir" -type d -exec chmod 755 {} \;

echo "文件权限修改完成"

案例六:查看大文件排行(磁盘排查)

脚本用途:查找指定目录下占用空间最大的前 10 个文件。

shell
#!/bin/bash

target_dir=${1:-/}  # 默认检查根目录,可自定义

echo "正在分析目录: $target_dir"

du -ah "$target_dir" 2>/dev/null | sort -rh | head -n 10

案例七:监控某个端口是否开放

脚本用途:判断某个端口是否处于监听状态。

shell
#!/bin/bash

port=80

if ss -ltn | grep -q ":$port "; then
    echo "端口 $port 已开启监听"
else
    echo "端口 $port 未监听"
fi

案例八:批量检测主机是否在线(Ping 多台主机)

脚本用途:批量 Ping IP,判断主机是否在线。

shell
#!/bin/bash

for ip in 192.168.1.{1..10}; do
    if ping -c 1 -W 1 $ip &>/dev/null; then
        echo "$ip 在线"
    else
        echo "$ip 不可达"
    fi
done

案例九:定时删除 7 天前的日志文件

脚本用途:清理老旧日志,释放磁盘空间。

shell
#!/bin/bash

log_dir="/var/log/myapp"

find "$log_dir" -type f -name "*.log" -mtime +7 -exec rm -f {} \;

echo "已删除 7 天前日志"

案例十:自动打包并上传至远程服务器

脚本用途:将文件压缩后通过 scp 上传。

shell
#!/bin/bash

src_dir="/data/project"
backup_file="project_$(date +%F).tar.gz"
remote_user="user"
remote_host="192.168.1.100"
remote_dir="/backup/"

# 压缩
tar -czf "$backup_file" "$src_dir"

# 上传
scp "$backup_file" ${remote_user}@${remote_host}:${remote_dir}

# 清理本地压缩包
rm -f "$backup_file"

echo "打包上传完成"

案例十一:检测磁盘使用率并报警

脚本用途:检测根分区使用率,超过阈值则报警。

shell
#!/bin/bash

threshold=80
usage=$(df / | tail -1 | awk '{print $5}' | tr -d '%')

if [ "$usage" -gt "$threshold" ]; then
    echo "警告:磁盘使用率已达 $usage%"
else
    echo "磁盘使用正常,当前使用率为 $usage%"
fi

案例十二:查找最近修改的文件

脚本用途:找出最近 10 分钟内被修改过的文件。

shell
#!/bin/bash

find /path/to/check -type f -mmin -10

案例十三:查看内存使用最多的进程

脚本用途:按内存使用排序显示前 5 个进程。

shell
#!/bin/bash

ps aux --sort=-%mem | head -n 6

案例十四:快速查看当前登录用户

脚本用途:显示当前登录系统的所有用户。

shell
#!/bin/bash

who | awk '{print $1}' | sort | uniq

案例十五:批量创建用户脚本

脚本用途:根据用户名列表文件,批量创建用户。

shell
#!/bin/bash

while read user; do
    if id "$user" &>/dev/null; then
        echo "用户 $user 已存在"
    else
        useradd "$user"
        echo "用户 $user 已创建"
    fi
done < users.txt

(说明:users.txt 文件中每一行是一个用户名)


案例十六:定期检测网页状态

脚本用途:检测网站是否正常访问。

shell
#!/bin/bash

url="https://www.example.com"

status_code=$(curl -o /dev/null -s -w "%{http_code}" "$url")

if [ "$status_code" -eq 200 ]; then
    echo "网站访问正常"
else
    echo "警告:网站访问异常,状态码为 $status_code"
fi

案例十七:查看服务器最近一次开机时间

脚本用途:查看服务器的开机时间和运行时长。

shell
#!/bin/bash

echo "最近一次开机时间:$(who -b)"
echo "已运行时长:$(uptime -p)"

案例十八:批量 ping 多台主机检测网络通畅性

脚本用途:从文件中读取 IP 列表并依次 ping,查看是否可达。

shell
#!/bin/bash

for ip in $(cat ip_list.txt); do
    if ping -c 1 -W 1 $ip &>/dev/null; then
        echo "$ip 通"
    else
        echo "$ip 不通"
    fi
done

(说明:ip_list.txt 每行一个 IP)


案例十九:统计当前目录下文件类型数量

脚本用途:查看当前目录下各种文件类型的数量。

shell
#!/bin/bash

echo "普通文件数量:$(find . -type f | wc -l)"
echo "目录数量:$(find . -type d | wc -l)"
echo "符号链接数量:$(find . -type l | wc -l)"

案例二十:自动备份指定目录并打包

脚本用途:将指定目录打包为带时间戳的压缩包。

shell
#!/bin/bash

target="/home/user/data"
backup_dir="/home/user/backup"
timestamp=$(date +%F-%H-%M-%S)
filename="backup-$timestamp.tar.gz"

mkdir -p "$backup_dir"
tar -czf "$backup_dir/$filename" "$target"

echo "备份完成:$backup_dir/$filename"

案例二十一:清理日志文件(大于指定大小)

脚本用途:清理当前目录下超过 100MB 的 .log 文件。

shell
#!/bin/bash

find . -name "*.log" -size +100M -exec rm -v {} \;

案例二十二:实时监控某服务状态

脚本用途:每 5 秒检查一次 nginx 是否运行。

shell
#!/bin/bash

while true; do
    systemctl is-active nginx &>/dev/null
    if [ $? -eq 0 ]; then
        echo "$(date): nginx 正在运行"
    else
        echo "$(date): nginx 已停止"
    fi
    sleep 5
done

案例二十三:日志分析脚本(Nginx 示例)

脚本用途:统计 Nginx 日志中出现最多的 IP、请求路径、状态码等信息,帮助排查异常流量或攻击行为。

shell
#!/bin/bash
# Nginx 日志文件路径(请根据实际情况修改)
log_file="/var/log/nginx/access.log"

echo "最近访问最多的 IP:"
awk '{print $1}' $log_file | sort | uniq -c | sort -nr | head -10

echo -e "\n请求最多的 URL:"
awk '{print $7}' $log_file | sort | uniq -c | sort -nr | head -10

echo -e "\n最常见的状态码统计:"
awk '{print $9}' $log_file | grep -E '^[0-9]{3}$' | sort | uniq -c | sort -nr

echo -e "\n访问量随时间分布(按小时统计):"
awk '{print $4}' $log_file | cut -d: -f2 | sort | uniq -c

🔍 说明:

  • $1: IP 地址
  • $7: 请求的路径
  • $9: 返回状态码
  • $4: 时间字段(包含小时)

案例二十四:Docker 容器运行状态巡检脚本

脚本用途:快速查看系统中所有 Docker 容器的运行状态、端口映射、资源占用等信息。

shell
#!/bin/bash

echo "-------------------- Docker 环境基本信息 --------------------"
docker_version=$(docker -v)
echo "Docker 版本: $docker_version"

echo -e "\nDocker 当前使用的存储驱动:"
docker info | grep "Storage Driver"

echo -e "\nDocker 当前使用的日志驱动:"
docker info | grep "Logging Driver"

echo "-------------------- 正在运行的容器 --------------------"
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"

echo -e "\n-------------------- 所有容器资源占用 --------------------"
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

echo -e "\n-------------------- 容器重启次数排行 --------------------"
docker ps -a --format '{{.Names}}\t{{.RestartCount}}' | sort -k2 -nr | head -10

echo -e "\n-------------------- 最近异常退出的容器 --------------------"
docker ps -a --filter "status=exited" --filter "status=dead" --format "table {{.Names}}\t{{.Status}}\t{{.Image}}" | head -10

📌 说明:

  • docker ps:列出当前运行中的容器。
  • docker stats --no-stream:显示容器资源使用情况(CPU、内存)。
  • --format:格式化输出,便于脚本处理。
  • RestartCount 仅在部分 Docker 版本中支持。

案例二十五:扫描 192.168.2.0/24 网络内在线主机

脚本用途:扫描局域网内 192.168.2.0/24 网段内的主机,并列出当前在线的 IP 地址。

shell
#!/bin/bash

# 设置扫描的网络段
network="192.168.2.0/24"

echo "开始扫描网络:$network"

# 使用 nmap 扫描在线的 IP 地址
online_ips=$(nmap -sn $network | grep "Nmap scan report for" | awk '{print $5}')

echo "当前在线的 IP 地址:"
for ip in $online_ips; do
    echo $ip
done

说明:

  • nmap -sn $network:使用 Nmap 工具进行网络扫描,-sn 选项表示仅扫描主机存活状态。
  • grep "Nmap scan report for":筛选出 Nmap 输出中的主机信息。
  • awk '{print $5}':提取出每一行中的 IP 地址。

前提:

  • 需要安装 nmap 工具。可以通过 sudo apt install nmap 安装。
  • nmap 扫描可能会被防火墙或网络设备限制。

案例二十六:基于 Web 日志监控并封禁异常 IP(防止 DDoS 攻击)

脚本用途:通过分析 Web 服务器日志,监控某个 IP 地址的并发连接数或页面访问量。如果某个 IP 地址在短时间内访问超过阈值(例如:100),就自动封禁该 IP。

shell
#!/bin/bash

# 配置参数
log_file="/var/log/nginx/access.log"  # Nginx 或 Apache 访问日志
max_requests=100  # 设置并发连接数或者访问量的阈值(根据实际情况调整)
block_duration=3600  # 封禁时长(单位:秒)

echo "检查 Web 日志并查找异常 IP ..."

# 找到访问量超过阈值的 IP
exceed_ips=$(awk '{print $1}' $log_file | sort | uniq -c | awk -v max_requests=$max_requests '$1 > max_requests {print $2}')

# 如果有超过阈值的 IP,则封禁
for ip in $exceed_ips; do
    echo "发现异常 IP: $ip,超出访问量阈值,封禁中..."
    
    # 封禁 IP 地址
    iptables -I INPUT -s $ip -j DROP
    
    echo "IP: $ip 已被封禁"

    # 可选:封禁后将封禁记录添加到一个日志文件中,便于审计
    echo "$(date)封禁 IP: $ip" >> /var/log/ddos_block.log

    # 可选:设置防火墙规则的过期时间
    # iptables -I INPUT -s $ip -j DROP
    # 在 $block_duration 秒后自动解除封禁规则
    sleep $block_duration
    iptables -D INPUT -s $ip -j DROP
    echo "$(date)解除封禁 IP: $ip" >> /var/log/ddos_block.log
done

echo "DDoS 防护脚本执行完毕"

解释:

  • log_file:指定 Web 服务器的访问日志文件路径(根据实际环境修改)。
  • max_requests:设置每个 IP 地址允许的最大请求次数。如果某个 IP 地址在短时间内超过此阈值,则被认为是 DDoS 攻击的嫌疑 IP。
  • iptables -I INPUT -s $ip -j DROP:使用 iptables 防火墙封禁目标 IP 地址的所有访问。
  • sleep $block_durationiptables -D:设置一个自动解除封禁的机制,封禁一段时间后自动解除。

案例二十七:批量检查多个网站地址是否正常

脚本用途:批量检查多个网站地址的可用性,每 10 秒钟做一次检测。如果某个网站无法访问,则输出报警。

shell
#!/bin/bash

# 待检测的网站地址列表
urls=("http://blog.alexmk.com" "http://blog.alexmk.org" "http://alexmk.blog.51cto.com" "http://10.0.0.7")

# 检查次数(循环次数)
check_interval=10  # 每 10 秒检测一次

echo "开始批量检测网站状态,检测间隔 $check_interval 秒..."

# 无限循环,每 10 秒检测一次
while true; do
    for url in "${urls[@]}"; do
        # 使用 curl 模拟用户访问,检查网站是否可访问
        http_status=$(curl -s -o /dev/null -w "%{http_code}" $url)

        # 如果 HTTP 状态码不是 200,表示网站无法访问
        if [ "$http_status" -ne 200 ]; then
            echo "警告:$url 无法访问,HTTP 状态码:$http_status"
        else
            echo "$url 正常访问,HTTP 状态码:$http_status"
        fi
    done

    # 每 10 秒检测一次
    sleep $check_interval
done

解释:

  1. urls 数组:包含需要检测的网站地址列表。你可以根据实际情况向数组中添加或删除 URL 地址。
  2. curl 命令:用于模拟用户访问网站,通过 curl -s -o /dev/null -w "%{http_code}" 来获取 HTTP 状态码。-s 表示静默模式,-o /dev/null 表示忽略输出内容,-w "%{http_code}" 获取 HTTP 响应的状态码。
  3. 检测策略:如果返回的 HTTP 状态码不是 200(即网站访问失败),则输出报警信息;否则输出正常访问的信息。
  4. sleep $check_interval:每 10 秒钟执行一次检测,可以根据需要调整时间间隔。

案例二十八:Nginx 负载节点状态命令行监控

功能描述:通过命令行监控 Nginx 负载均衡节点的状态,使用绿色表示正常节点,使用红色表示不可用的节点。

1. Shell 脚本部分:命令行显示颜色

shell
#!/bin/bash

# 配置 Nginx 代理节点的 IP 地址列表
nodes=("http://192.168.1.10" "http://192.168.1.11" "http://192.168.1.12")

# 健康检查间隔
check_interval=10  # 每 10 秒钟检查一次

# 无限循环检测节点状态
while true; do
    # 清屏
    clear
    echo -e "\033[1;34mNginx Node Health Check\033[0m"  # 输出标题,蓝色

    # 打印表格头部
    echo -e "\033[1;37m----------------------------------------\033[0m"
    echo -e "\033[1;37mNode Address\t\tStatus\033[0m"
    echo -e "\033[1;37m----------------------------------------\033[0m"

    # 检查每个节点的状态
    for node in "${nodes[@]}"; do
        # 使用 curl 检查节点是否正常
        http_status=$(curl -s -o /dev/null -w "%{http_code}" $node)

        # 判断节点状态
        if [ "$http_status" -ne 200 ]; then
            status="down"
            color="\033[1;31m"  # 红色
        else
            status="up"
            color="\033[1;32m"  # 绿色
        fi

        # 打印节点状态,使用颜色
        echo -e "${color}$node\t\t$status\033[0m"
    done

    # 每 10 秒检测一次
    sleep $check_interval
done

颜色输出:

- 使用 `\033[1;32m` 来输出绿色(`up` 状态)。
- 使用 `\033[1;31m` 来输出红色(`down` 状态)。
- 使用 `\033[1;34m` 来输出蓝色(标题部分)。
- 使用 `\033[0m` 来重置颜色。
  1. **clear**** 命令**:每次循环时清屏,保证输出更新时不会混乱。

  2. **curl**** 命令**:检查每个 Nginx 节点的健康状态,返回状态码 200 时表示节点正常。

  3. 输出格式:通过 \t(制表符)对齐输出,确保每行显示清晰。

  4. 运行效果:

当你运行此脚本时,命令行将显示如下内容:

shell
Nginx Node Health Check
----------------------------------------
Node Address        Status
----------------------------------------
http://192.168.1.10   up
http://192.168.1.11   down
http://192.168.1.12   up
  • 绿色:表示该节点正常(up)。
  • 红色:表示该节点不可用(down)。
  1. 运行示例:

  2. 执行脚本:

shell
./nginx_status_check.sh
  1. 每次循环(每 10 秒)会清屏并刷新输出,显示各个节点的最新状态。

感谢阅读,欢迎交流!