本文目录导读:

检测服务是否存活(健康检查)有多种脚本实现方式,具体取决于服务类型和网络环境,以下是几种常见方法:
基于TCP端口检测(通用性最强)
Shell脚本
#!/bin/bash
HOST="127.0.0.1"
PORT=8080
TIMEOUT=5
# 使用nc(netcat)检测
nc -z -w $TIMEOUT $HOST $PORT > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "Service on $HOST:$PORT is UP"
exit 0
else
echo "Service on $HOST:$PORT is DOWN"
exit 1
fi
使用/dev/tcp(bash内置)
#!/bin/bash
HOST="127.0.0.1"
PORT=8080
if timeout 5 bash -c "echo >/dev/tcp/$HOST/$PORT" 2>/dev/null; then
echo "Service is UP"
exit 0
else
echo "Service is DOWN"
exit 1
fi
基于HTTP/HTTPS检测(Web服务)
Shell脚本
#!/bin/bash
URL="http://127.0.0.1:8080/health"
TIMEOUT=10
# 使用curl检测
if curl -s -o /dev/null -w "%{http_code}" --connect-timeout $TIMEOUT $URL | grep -q "200\|301\|302"; then
echo "HTTP service is UP"
exit 0
else
echo "HTTP service is DOWN"
exit 1
fi
# 或者检查返回内容包含特定字符串
if curl -s --connect-timeout $TIMEOUT $URL | grep -q "healthy"; then
echo "Service is healthy"
exit 0
fi
Python脚本
#!/usr/bin/env python3
import requests
import sys
url = "http://127.0.0.1:8080/health"
try:
response = requests.get(url, timeout=10)
if response.status_code == 200 and "healthy" in response.text:
print("Service is UP")
sys.exit(0)
else:
print(f"Service returned status {response.status_code}")
sys.exit(1)
except Exception as e:
print(f"Service is DOWN: {e}")
sys.exit(1)
基于进程检测(本地服务)
Shell脚本
#!/bin/bash
PROCESS_NAME="nginx"
# 检查进程是否存在
if pgrep -x "$PROCESS_NAME" > /dev/null; then
echo "Process $PROCESS_NAME is running"
exit 0
else
echo "Process $PROCESS_NAME is not running"
exit 1
fi
# 或者使用ps命令
if ps aux | grep -v grep | grep "$PROCESS_NAME" > /dev/null; then
echo "Process found"
fi
基于systemd服务检测
#!/bin/bash
SERVICE_NAME="nginx.service"
if systemctl is-active --quiet "$SERVICE_NAME"; then
echo "Service $SERVICE_NAME is active"
exit 0
else
echo "Service $SERVICE_NAME is inactive"
exit 1
fi
# 查看详细状态
systemctl status "$SERVICE_NAME" --no-pager
综合检测脚本(生产级)
#!/bin/bash
SERVICE_NAME="myapp"
HOST="127.0.0.1"
PORT=8080
HEALTH_URL="http://$HOST:$PORT/health"
TIMEOUT=10
RETRY_COUNT=3
RETRY_INTERVAL=2
check_tcp() {
nc -z -w $TIMEOUT $HOST $PORT > /dev/null 2>&1
}
check_http() {
curl -s -o /dev/null -w "%{http_code}" --connect-timeout $TIMEOUT $HEALTH_URL | grep -q "200"
}
check_process() {
pgrep -x "$SERVICE_NAME" > /dev/null 2>&1
}
main() {
local retries=$RETRY_COUNT
while [ $retries -gt 0 ]; do
if check_tcp && check_http; then
echo "[$(date)] $SERVICE_NAME is healthy"
return 0
fi
retries=$((retries - 1))
if [ $retries -gt 0 ]; then
echo "[$(date)] Health check failed, retrying in ${RETRY_INTERVAL}s..."
sleep $RETRY_INTERVAL
fi
done
echo "[$(date)] $SERVICE_NAME is DOWN after $RETRY_COUNT retries"
return 1
}
main "$@"
特定数据库检测
# MySQL检测
mysqladmin ping -h localhost -u root -p'password' > /dev/null 2>&1
# PostgreSQL检测
pg_isready -h localhost -p 5432 > /dev/null 2>&1
# Redis检测
redis-cli -h localhost -p 6379 ping > /dev/null 2>&1
# MongoDB检测
mongo --host localhost --port 27017 --eval "db.adminCommand('ping')" > /dev/null 2>&1
使用工具检测
使用systemctl(systemd系统)
systemctl is-active myservice.service
使用docker(容器化服务)
# 检查容器状态
docker inspect -f '{{.State.Status}}' container_name
# 或使用docker ps
docker ps --filter "status=running" --filter "name=container_name" -q
最佳实践建议
-
分层检测:
- 第一层:进程是否存在
- 第二层:端口是否监听
- 第三层:HTTP接口是否响应
- 第四层:业务逻辑是否正常
-
超时设置:避免长时间阻塞
-
重试机制:防止偶发网络波动误判
-
日志记录:记录健康检查结果用于排查
-
告警集成:服务异常时自动告警
选择哪种检测方式取决于:
- 服务类型(Web/API/数据库等)
- 部署环境(容器/裸机/云服务)
- 可用工具(netcat/curl/systemctl等)
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播