监控lmgrd进程是否存活,是FlexNet许可证服务器运维中最基础也最重要的任务。但真正的监控不能只看进程——进程在不等于服务在。本文提供一套从基础到进阶的监控方案,覆盖进程监控、服务可用性验证和告警配置三个层面。
| 层面 | 检查内容 | 目的 |
|---|---|---|
| 进程层 | lmgrd和vendor daemon进程是否存在 | 确认服务进程未崩溃 |
| 服务层 | 许可证能否正常签出/签入 | 确认服务真正可用 |
只监控进程是不够的。 常见的情况是:lmgrd进程还在,但vendor daemon已经挂了。这时lmstat -a查询不到任何许可证信息,客户端报错-97,但进程监控仍然显示"正常"。
bash
#!/bin/bash
# check_flexnet.sh
if ! pgrep -x "lmgrd" > /dev/null; then
echo "WARNING: lmgrd is not running"
# 触发告警逻辑
exit 1
fi
echo "OK: lmgrd is running"
exit 0bash
#!/bin/bash
# check_flexnet_full.sh
LMGRD_PROCESS="lmgrd"
VENDOR_PROCESS="snpslmd" # 替换为实际的vendor daemon名称
LOG_FILE="/var/log/flexnet_monitor.log"
# 检查lmgrd
if ! pgrep -x "$LMGRD_PROCESS" > /dev/null; then
echo "$(date): ERROR - lmgrd process not found" >> "$LOG_FILE"
# 尝试自动重启
systemctl start flexnet
exit 1
fi
# 检查vendor daemon
if ! pgrep -x "$VENDOR_PROCESS" > /dev/null; then
echo "$(date): ERROR - vendor daemon ($VENDOR_PROCESS) not found" >> "$LOG_FILE"
# 尝试自动重启
systemctl restart flexnet
exit 1
fi
echo "$(date): OK - all processes running" >> "$LOG_FILE"
exit 0bash
# 每5分钟检查一次
*/5 * * * * /opt/scripts/check_flexnet_full.sh
# 每2分钟检查一次(需要更高实时性的场景)
*/2 * * * * /opt/scripts/check_flexnet_full.sh进程监控的局限性在于:进程在,但服务可能已经不可用。 更可靠的方式是直接测试许可证签出功能。
bash
#!/bin/bash
# check_flexnet_service.sh
LMUTIL="/opt/flexnet/lmutil"
LICENSE_FILE="/opt/flexnet/license.lic"
SERVER="27000@localhost"
VENDOR="snpslmd"
# 方法1:用lmstat检查vendor daemon状态
output=$($LMUTIL lmstat -a -c "$LICENSE_FILE" 2>&1)
if echo "$output" | grep -q "Vendor daemon status"; then
if echo "$output" | grep -q "DOWN" || echo "$output" | grep -q "down"; then
echo "ERROR: Vendor daemon is DOWN"
exit 1
fi
echo "OK: Vendor daemon is running"
exit 0
else
echo "ERROR: Cannot get license status"
exit 1
fibash
#!/bin/bash
# check_flexnet_feature.sh
LMUTIL="/opt/flexnet/lmutil"
FEATURE="test_feature" # 替换为一个实际存在的feature
SERVER="27000@localhost"
# 尝试签出测试feature
$LMUTIL lmstat -c "$SERVER" -f "$FEATURE" 2>&1 | grep -q "Users of $FEATURE:"
if [ $? -eq 0 ]; then
echo "OK: Feature $FEATURE is available"
exit 0
else
echo "ERROR: Feature $FEATURE is NOT available"
exit 1
fi注意:签出测试许可证的方法会对许可证池产生实际占用。如果测试频率较高(如每5分钟一次),会持续消耗一个许可名额。建议选择以下替代方案之一:使用lmstat -a查询状态而不实际签出配置一个专用的测试许可证或预留一个许可给监控使用降低测试频率(如每小时一次)
配合systemd服务的Restart=on-failure是最简单的方式。如果监控脚本检测到进程死亡,触发systemd重启:
bash
#!/bin/bash
# check_flexnet_with_restart.sh
if ! pgrep -x "lmgrd" > /dev/null; then
echo "$(date): lmgrd died, attempting restart..." >> /var/log/flexnet_monitor.log
systemctl restart flexnet
sleep 5
if pgrep -x "lmgrd" > /dev/null; then
echo "$(date): Restart successful" >> /var/log/flexnet_monitor.log
else
echo "$(date): Restart FAILED" >> /var/log/flexnet_monitor.log
fi
fibash
#!/bin/bash
# check_flexnet_with_email.sh
ALERT_EMAIL="admin@yourcompany.com"
HOSTNAME=$(hostname)
if ! pgrep -x "lmgrd" > /dev/null; then
echo "Subject: [ALERT] FlexNet License Server Down on $HOSTNAME
lmgrd process is not running.
Please check immediately." | sendmail "$ALERT_EMAIL"
fibash
#!/bin/bash
# send_dingtalk_alert.sh
WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=xxx"
HOSTNAME=$(hostname)
MESSAGE="{\"msgtype\":\"text\",\"text\":{\"content\":\"[ALERT] FlexNet License Server Down on $HOSTNAME\"}}"
if ! pgrep -x "lmgrd" > /dev/null; then
curl -X POST -H "Content-Type: application/json" -d "$MESSAGE" "$WEBHOOK_URL"
fi在Prometheus中配合node_exporter的textfile收集器,可以采集并暴露许可证服务器的状态指标。
第一步:生成指标文件
编写一个脚本,定期将许可证状态写入/var/lib/node_exporter/textfile/flexnet.prom:
bash
#!/bin/bash
# flexnet_exporter.sh
OUTPUT_DIR="/var/lib/node_exporter/textfile"
LMGRD_RUNNING=0
VENDOR_RUNNING=0
if pgrep -x "lmgrd" > /dev/null; then
LMGRD_RUNNING=1
fi
if pgrep -x "snpslmd" > /dev/null; then
VENDOR_RUNNING=1
fi
cat > "$OUTPUT_DIR/flexnet.prom" << EOF
# HELP flexnet_lmgrd_up lmgrd process status (1=up, 0=down)
# TYPE flexnet_lmgrd_up gauge
flexnet_lmgrd_up $LMGRD_RUNNING
# HELP flexnet_vendor_up vendor daemon status (1=up, 0=down)
# TYPE flexnet_vendor_up gauge
flexnet_vendor_up $VENDOR_RUNNING
EOF第二步:配置crontab定时执行
bash
* * * * * /opt/scripts/flexnet_exporter.sh第三步:在Prometheus中配置告警规则
yaml
groups:
- name: flexnet_alerts
rules:
- alert: FlexNetLicenseServerDown
expr: flexnet_lmgrd_up == 0
for: 2m
annotations:
summary: "FlexNet License Server is down"
severity: criticalZabbix用户可以使用system.run[]键值直接执行脚本并采集返回值:
bash
# Zabbix Agent配置
UserParameter=flexnet.lmgrd,pgrep -x "lmgrd" | wc -l
UserParameter=flexnet.vendor,pgrep -x "snpslmd" | wc -lZabbix Server端配置触发器:
建议收集以下指标,用于长期运维分析和趋势判断:
| 指标 | 采集方式 | 用途 |
|---|---|---|
| lmgrd进程状态 | pgrep -x lmgrd | 确认主进程是否存活 |
| vendor daemon状态 | pgrep -x snpslmd | 确认核心服务是否存活 |
| 许可证使用率 | lmstat -a解析 | 容量规划和采购决策 |
| 可用许可证数量 | lmstat -a解析 | 判断是否需要扩容 |
| 排队用户数 | lmstat -a解析 | 判断高峰期拥挤情况 |
| 端口连通性 | telnet 端口 | 确认网络可达 |
1. 频率控制
2. 区分计划内停机
3. 告警风暴控制
| 监控层级 | 方法 | 适用场景 | 推荐度 |
|---|---|---|---|
| 基础 | pgrep检查进程 | 简单场景,快速部署 | ★★★ |
| 进阶 | lmstat -a验证服务 | 需要确认服务可用性 | ★★★★★ |
| 可靠 | 签出测试feature | 对可用性要求极高 | ★★★★ |
| 专业 | Prometheus + AlertManager | 大规模运维 | ★★★★★ |
核心建议:不要只用进程监控。配合lmstat -a检查vendor daemon状态,才能真正确认服务可用。