可靠监控hyperf单机服务需用systemd判断运行态而非仅查进程:先确认服务名如myapp.service,用systemctl is-active验证active状态,再选加curl健康检查,记录日志并告警,定时执行且确保权限。

直接用 shell 脚本配合 systemd 就能可靠监控 Hyperf 单机服务状态,关键不是“查进程是否存在”,而是确认它是否真正健康运行。
明确要监控的 Hyperf 服务名
Hyperf 服务通常以 .service 文件注册到 systemd,比如 myapp.service 或 hyperf-api.service。先确认真实服务名:
systemctl list-units | grep -i hyperf
把名字写进脚本数组,避免硬编码或模糊匹配:
services=("myapp.service" "hyperf-worker.service")
不要写成 php bin/hyperf.php start 这类命令行,那是启动方式,不是 systemd 管理的服务单元名。
用 systemctl is-active 判断真实运行态
Hyperf 基于 Swoole 常驻内存,一旦崩溃或卡死,进程可能残留但已不响应请求。只靠 ps 或 pgrep 容易误判。必须用:
if systemctl is-active --quiet "$svc"; then
echo "$svc: active"
else
echo "$svc: not active"
fi
这个命令返回 active 才代表服务被 systemd 正确启动且未进入 failed、inactive 或 activating 状态。
补充 HTTP 健康检查(可选但推荐)
systemd 只管进程生命周期,不验证业务可用性。建议加一层 /health 或 /metrics 接口探测:
if curl -sf http://127.0.0.1:9501/health -o /dev/null; then
echo "$svc: health check OK"
else
echo "$svc: health check FAILED"
fi
注意:确保 Hyperf 已启用健康检查中间件,且端口未被防火墙拦截。
记录日志并触发基础告警
每次巡检结果写入日志,异常时发通知:
echo "$(date '+%Y-%m-%d %H:%M:%S'): $svc → $(systemctl is-active "$svc" 2>/dev/null)" >> /var/log/hyperf-monitor.log
if ! systemctl is-active --quiet "$svc"; then
logger -t hyperf-monitor "ALERT: $svc is not active"
# 可选:发邮件或调用 webhook
echo "[$(date)] $svc down!" | mail -s "Hyperf Service Down" admin@example.com
fi
设置定时执行与权限保障
用 cron 每 2 分钟跑一次(比默认 5 分钟更及时):
*/2 * * * * /opt/bin/check-hyperf.sh >/dev/null 2>&1
脚本开头加上健壮性防护:
#!/bin/bash set -e [ -x "$(command -v systemctl)" ] || exit 1 timeout 8 systemctl is-active "$svc" 2>/dev/null || echo "timeout"
确保脚本由 root 或有 systemctl 权限的用户运行,避免权限拒绝。
不复杂但容易忽略。写完先手动执行一遍,再等几分钟看日志和告警是否按预期触发,基本就稳了。











