Linux巡检脚本应按服务类型选择检测方式:systemd服务用systemctl is-active,端口服务用timeout+tcp测试,HTTP服务用curl检查健康接口,并采用数组循环结构、超时控制、时间戳日志和定时执行。

Linux 编写检查服务存活状态的巡检脚本,核心是判断服务是否在运行、端口是否可访问、进程是否存在或健康接口是否返回正常响应。关键不在于写得多复杂,而在于选对检测方式、覆盖常见失败场景、输出明确结果。
确认服务类型,选择合适检测方式
不同服务适合不同检测逻辑,混用容易误判:
-
系统服务(如 nginx、sshd):优先用
systemctl is-active判断服务单元状态,再辅以pgrep检查主进程是否存在 -
监听端口的服务(如 Redis、MySQL):用
nc -zv或timeout 3 bash -c 'echo > /dev/tcp/127.0.0.1/6379' &>/dev/null测试端口连通性 -
提供 HTTP 健康接口的服务(如 Spring Boot、Prometheus):用
curl -sfL --connect-timeout 3 --max-time 5 http://localhost:8080/actuator/health | grep -q '"status":"UP"' -
自定义守护进程(无 systemd 管理):结合
pidof、ps -p $PID -o comm=验证进程名和状态,避免仅靠 PID 文件判断
脚本结构要简洁、可读、可扩展
避免把所有服务硬编码进一个 if 块。推荐用数组+循环方式管理服务列表,方便增删:
# 示例片段(bash)
services=(
"nginx:systemd"
"redis-server:port:6379"
"prometheus:http:http://localhost:9090/-/healthy"
)
<p>for item in "${services[@]}"; do
IFS=':' read -r name method addr /dev/tcp/127.0.0.1/$addr" &>/dev/null && echo "$name:$addr OK" || echo "$name:$addr DOWN" ;;
http) curl -sfL --connect-timeout 2 --max-time 4 "$addr" | grep -q "ok|UP" && echo "$name OK" || echo "$name DOWN" ;;
esac
done</p>
加入基础容错与日志记录
生产环境脚本不能只输出到终端,需记录时间戳和上下文:
- 每条检查前加
date +'%F %T'打印时间 - 将结果追加到日志文件(如
/var/log/service-check.log),避免覆盖 - 对关键服务失败情况,额外发邮件或写入 syslog(可用
logger -t service-check "nginx down") - 避免因某项超时拖慢整体巡检,每个检查都设
timeout或curl --max-time
部署与执行建议
脚本写完别忘了实际落地细节:
- 保存为
/usr/local/bin/check-services.sh,加执行权限:chmod +x - 用 crontab 定时运行(如每5分钟):
*/5 * * * * /usr/local/bin/check-services.sh >> /var/log/service-check.log 2>&1 - 首次运行手动执行一次,确认各服务检测逻辑是否适配当前环境(比如端口是否被改、健康路径是否正确)
- 若服务依赖其他组件(如数据库连接),可在检测前加简单预检,但避免嵌套过深











