在Shell脚本中远程探测两台数据库是否在线,通常需要根据数据库类型(如MySQL、PostgreSQL、Oracle等)使用对应的客户端工具或网络探测方法。以下是针对常见数据库的几种通用方案:
一、通用网络层探测(不依赖数据库协议)
如果只需检查数据库端口是否开放(快速但无法验证数据库实际服务状态),可使用以下命令:
# 使用 nc (netcat) 检查端口
nc -z -w 2 <IP地址> <端口号> && echo "在线" || echo "离线"
# 使用 telnet(若未安装nc)
timeout 2 telnet <IP地址> <端口号> 2>&1 | grep "Connected" && echo "在线" || echo "离线"
# 示例:检测192.168.1.10的MySQL端口(3306)
nc -z -w 2 192.168.1.10 3306 && echo "MySQL在线" || echo "MySQL离线"
二、数据库协议层探测(推荐,更准确)
1. MySQL/MariaDB
使用 mysqladmin
或 mysql
客户端执行简单查询:
# 方法1:mysqladmin ping
mysqladmin -h <主机IP> -P <端口> -u <用户名> -p<密码> ping 2>/dev/null | grep "alive" && echo "在线" || echo "离线"
# 方法2:mysql执行简单查询
mysql -h <主机IP> -P <端口> -u <用户名> -p<密码> -e "SELECT 1;" 2>/dev/null && echo "在线" || echo "离线"
# 示例(注意-p后无空格):
mysql -h 192.168.1.10 -P 3306 -u root -pmypassword -e "SELECT 1;" >/dev/null 2>&1 && echo "MySQL在线" || echo "MySQL离线"
2. PostgreSQL
使用 psql
客户端执行简单查询:
psql -h <主机IP> -p <端口> -U <用户名> -d postgres -c "SELECT 1;" >/dev/null 2>&1 && echo "在线" || echo "离线"
3. Redis
使用 redis-cli
发送PING命令:
redis-cli -h <主机IP> -p <端口> PING 2>/dev/null | grep "PONG" && echo "在线" || echo “离线”
4. MongoDB
使用 mongosh
或 mongo
(旧版本):
mongosh --host <主机IP>:<端口> --eval "db.adminCommand('ping')" 2>/dev/null | grep \"ok\"\ :\ 1 && echo “在线” || echo “离线”
三、封装成Shell函数示例(以MySQL为例)
#!/bin/bash
check_mysql() {
local host=$1
local port=$2
local user=$3
local pass=$4
if mysql -h "$host" -P "$port" u "$user"-p"$pass"-e “SELECT 1;” >/dev/null 2>&1; then
echo "[SUCCESS] MySQL at $host:$port is ONLINE"
return 0
else
echo "[ERROR] MySQL at $host:$port is OFFLINE"
return 1
fi
}
# 调用示例:检查两台数据库
check_mysql 192.168.1.10 3306 root mypassword
check_mysql 192.168.1.11 3306 root anotherpass
四、增强版脚本(支持超时和超时控制)
为避免长时间阻塞,建议添加超时限制:
#!/bin/bash
check_db_timeout() {
local host=$1
local port=$2
local user=$3
local pass=$4
local timeout=5 # 设置超时时间(秒)
# 使用timeout命令限制执行时间
if timeout $timeout mysql h "$host"-P "$port"-u "$user"-p "$pass"-e “SELECT 1;” >/dev/null 2>&1; then
return 0
else
return 1
fi
}
# 调用并判断返回值
if check_db_timeout 192 168 0 100 3306 root password; then
echo “数据库 192 168 0 100:3306 正常”
else
echo “数据库异常或超时”
fi
注意事项:
- 密码安全:
直接传递密码在命令行可能泄露信息(可通过配置文件隐藏密码,如MySQL的
.my.cnf
)。 - 错误处理:
建议将错误输出重定向到日志文件(如
2>> error.log
)。 - 依赖工具:
确保系统已安装对应数据库客户端(如
mysql-client
、postgresql-client
)。 - 防火墙规则: 确保脚本运行环境与数据库之间的网络连通性。
如果需要频繁检测,可结合定时任务(如cron)实现自动化监控。
内容由零声教学AI助手提供,问题来源于学员提问