“No available licenses”是FlexNet运维中最常见的错误之一。用户点开软件,弹出一个窗口,告诉你没有可用的许可证。有时候是暂时的,关掉重开就好了;有时候持续几个小时,所有人都在等。
这篇文章提供一个完整的排查流程,按顺序走一遍,大多数情况都能找到原因。
用户报“No available licenses”时,实际上可能有几种不同的错误码和表现形式:
不同的表现形式指向不同的问题。先看清楚用户遇到的是哪一种,再往下排查。
这是最直接的排查方向。用lmstat查看当前许可证的使用情况。
在服务器上执行:
bash
lmutil lmstat -a -c /path/to/license.lic或者从客户端远程查询:
bash
lmutil lmstat -a -c 27000@license-server输出结果里重点关注几个部分:
1. Vendor daemon状态
text
Vendor daemon status (on license-server):
snpslmd: UP如果显示DOWN,说明vendor daemon没起来,所有许可证都不可用。这种情况需要去查debug.log,看vendor daemon为什么启动失败。

2. 每个feature的使用情况
text
Users of CAD_Design: (Total of 50 licenses issued; Total of 50 licenses in use)如果in use等于issued,说明许可证池已经满了,所有许可都被占用了。这就是“No available licenses”的直接原因。
3. 具体谁在用
text
CAD_Design (Total of 50 licenses issued; Total of 50 licenses in use)
user1 workstation1 (v2024) (license-server/27000 1010), start Mon 8/18 9:23
user2 workstation2 (v2024) (license-server/27000 1011), start Mon 8/18 9:25
...能看到每个许可证被谁占用、从哪台机器签出的、什么时候开始的。
解读结果:
| lmstat输出 | 含义 | 下一步 |
|---|---|---|
in use < issued | 池子没满,还有空闲许可 | 问题不在数量上,检查客户端能否找到服务器 |
in use = issued | 池子满了 | 看下一步:谁在用、用了多久 |
vendor daemon状态DOWN | 服务本身有问题 | 查debug.log,修复服务 |
| 看不到任何feature | license文件没加载 | 检查license文件路径和内容 |
如果池子满了(in use = issued),需要判断这些占用是真实的还是“假满”——即有人占着许可但并没有真正在使用。
判断方法:看占用时长和活动状态。
用lmstat能看到每个会话的start时间。如果某个用户早上9点就签出了许可,到了下午3点还在占用,而且你记得这个人今天请假了或者上午开完会就走了——这很可能是个僵尸会话。
更精确的方法是配合options文件的TIMEOUT机制来观察。如果没有配置自动回收,就需要手动排查。
常见导致假满的原因:
如果确认有僵尸会话,用lmremove强制释放。
先获取会话信息:
bash
lmutil lmstat -a -c /path/to/license.lic输出里找到要释放的那一行,记录feature名称、用户名、主机名和handle值。
执行释放:
bash
lmutil lmremove -h feature_name 用户名 主机名 handle值具体格式因厂商而异。以Siemens的Simcenter Amesim为例:
bash
lmutil.exe lmremove -h <feature> <host> <port> <handle>释放后验证:
再次执行lmstat -a,确认该feature的in use数量减少了一个。
注意: lmremove只能由许可证管理员执行,普通用户没有权限。而且如果用户还在使用软件,强制释放会导致对方立即失去许可,可能丢失未保存的工作。操作前最好先确认对方确实不在使用状态。
如果池子里明明有空闲许可,但特定用户就是签不出来,问题可能出在options文件上。
options文件可以通过RESERVE、EXCLUDE、INCLUDE等指令控制许可证的分配。
检查方法:
找到options文件(在license文件的VENDOR行指定),查看是否有以下配置:
如果用户正好在EXCLUDE列表里,或者他所在的组不在INCLUDE列表里,就会报“No available licenses”——即使池子里有空闲许可。
快速验证方法: 临时把options文件移走(记得备份),重启vendor daemon或执行lmreread,让用户再试一次。如果能签出来了,说明options文件的规则限制了他。
有时候用户报“No available licenses”,但实际上连许可证服务器都没找到。客户端把“找不到服务器”和“没有可用许可”当成同一个错误来处理了。
在客户端上检查:
bash
lmutil lmstat -a -c 27000@license-server如果输出显示Cannot connect to license server或-15错误,说明客户端根本没连上服务器。这种情况下报“No available licenses”是误导——真实原因是网络不通或配置错误,不是许可不够。
如果lmstat能连上服务器但显示in use = issued,那才是真正的池子满了。如果lmstat连不上,先去排查网络连接和客户端配置。
如果池子满了,FlexNet允许后续请求排队等待。但排队是有超时时间的,超时后就会报“No available licenses”。
查看排队情况:
bash
lmutil lmstat -a -c /path/to/license.lic输出中如果有Users are queued for this feature,说明有用户在排队。

如果排队时间过长或排队用户过多,可以考虑:
如果池子里明明有足够的空闲许可,但用户仍然报错,检查以下两点:
1. feature名称是否匹配
用户软件请求的feature名称必须与license文件中的FEATURE或INCREMENT行完全一致。大小写敏感,不能有拼写错误。
用lmstat -f feature_name确认该feature是否存在。如果返回No such feature exists,说明用户请求的feature名称与license文件中的不一致。
2. 许可证是否过期
查看lmstat -a输出中的过期日期。如果当前日期超过了expire_date,该feature不可用。
3. 版本是否匹配
用户软件版本高于license文件支持的版本时,也会报错。
text
用户报“No available licenses”
↓
用lmstat查看许可证池状态
↓
lmstat能连上服务器吗?
├── 不能 → 排查网络连接、客户端配置(参考第32篇)
└── 能 ↓
in use = issued(池子满了)?
├── 否 → 检查options文件(RESERVE/EXCLUDE/INCLUDE)
│ 检查feature名称是否匹配
│ 检查许可证是否过期
└── 是 ↓
查看具体谁在用、用了多久
↓
有僵尸会话(长时间占用无活动)?
├── 是 → 用lmremove强制释放
└── 否 → 池子确实满了,需要:
① 采购更多许可证
② 配置TIMEOUT自动回收闲置许可
③ 优化许可证分配策略| 检查项 | 状态 |
|---|---|
用lmstat -a查看许可证池状态 | ☐ |
vendor daemon状态是否为UP | ☐ |
in use是否等于issued(池子满了) | ☐ |
| 查看具体占用用户和占用时长 | ☐ |
| 检查是否有僵尸会话需要释放 | ☐ |
检查options文件是否有RESERVE/EXCLUDE限制 | ☐ |
| 检查用户请求的feature名称是否正确 | ☐ |
| 检查许可证是否过期 | ☐ |
从客户端lmstat确认能连上服务器 | ☐ |
“No available licenses”有两种本质不同的情况:
第一种:池子真满了。 lmstat显示in use = issued,所有许可都被占了。解决方案是释放僵尸会话、配置自动回收、或者采购更多许可。
第二种:池子没满但用户拿不到。 lmstat显示还有空闲许可,但用户就是报错。问题出在options文件的限制、feature名称不匹配、或客户端根本没连上服务器。
排查时先用lmstat看清楚池子的真实状态——是真满还是假满,是池子问题还是配置问题——再对症下药。不要在没搞清楚状况之前就去重启服务器或者找厂商加许可,那只会让问题更复杂。