RUNBOOK — FlexLM systemd 单元运维(31.29)¶
服务主机:
192.168.31.29(主机名Flexlm) 覆盖单元:flexlm-cadence.service(5280/5281)、flexlm-synopsys.service(2700/2701) 变更档案见docs/SOP.md(systemd 化,2026-09-28) 当前状态:两个单元均 active + enabled(2026-09-28 13:19 起)
目录¶
1. 服务概览¶
同一台主机上托管两套互相独立的 FlexLM 许可服务。systemd 负责启动、开机自启与异常重启。
| 单元 | 厂商 / vendor daemon | 目录 | 端口(lmgrd / vendor) | 许可内容 |
|---|---|---|---|---|
flexlm-cadence.service |
Cadence / cdslmd |
/opt/FlexLM/Cadence/ |
5280 / 5281 | cds.license.dat(605 feature) |
flexlm-synopsys.service |
Synopsys / snpslmd |
/opt/FlexLM/Synopsys/ |
2700 / 2701 | Synopsys.dat(2847 feature) |
为什么是两个单元而不是一个:FlexLM 的 lmgrd 是通用调度器,厂商逻辑在 vendor daemon。
把两家合并进同一个 lmgrd 会带来签名/版本互斥与故障域耦合,故各自独立。详见
synopsys_license_20260928/docs/SOP.md 第 1 章。
| 项 | 内容 |
|---|---|
| 依赖 | 无外部依赖(不依赖 NFS、不依赖 module load) |
| 异常影响 | 对应厂商的全部客户端无法启动工具(提示找不到 license server) |
| 重要性 | 高(各自单点,无冗余) |
| 自愈 | Restart=on-failure,异常退出后 10s 重启;受 StartLimitBurst=5/300s 限制 |
| 已知限制 | ① 无告警——服务挂了无人知;② 重启后需 60–70 秒才恢复监听(见第 8 章场景 C) |
2. 接入与凭据¶
- 登录:本地 root 免密 SSH 到
root@192.168.31.29(密钥见管理员本机~/.ssh/,凭据不入文档)。 - 客户端接入(两套各自设置,不要混用):
export CDS_LIC_FILE=5280@192.168.31.29 # Cadence
export SNPSLMD_LICENSE_FILE=2700@192.168.31.29 # Synopsys
- 客户端连通性自检:
nc -vz 192.168.31.29 5280 && nc -vz 192.168.31.29 2700
- 通用排查工具(两套通用,来自 SCL):
/opt/FlexLM/Synopsys/lmutil lmstat -c 5280@192.168.31.29 # 查 Cadence
/opt/FlexLM/Synopsys/lmutil lmstat -c 2700@192.168.31.29 # 查 Synopsys
3. 日常速查表¶
| 目的 | 命令 |
|---|---|
| 看两套状态 | ssh root@192.168.31.29 'systemctl is-active flexlm-cadence flexlm-synopsys' |
| 看单元详情 | ssh root@192.168.31.29 'systemctl status flexlm-cadence.service flexlm-synopsys.service' |
| 看端口 | ssh root@192.168.31.29 'ss -lntp \| grep -E ":5280\|:5281\|:2700\|:2701"' |
| 看进程与 cgroup | ssh root@192.168.31.29 'systemctl status flexlm-cadence.service -n 0 \| grep -A3 CGroup' |
| 重启单套(安全) | ssh root@192.168.31.29 'systemctl restart flexlm-synopsys.service' |
| 停止单套(安全) | ssh root@192.168.31.29 'systemctl stop flexlm-cadence.service' |
| 看 journal | ssh root@192.168.31.29 'journalctl -u flexlm-cadence.service -n 30' |
| 看 license 日志 | ssh root@192.168.31.29 'tail -30 /opt/FlexLM/Cadence/lmgrd.log' |
| 开机自启状态 | ssh root@192.168.31.29 'systemctl is-enabled flexlm-cadence.service flexlm-synopsys.service' |
可按单元名操作——两套服务各自独立 cgroup,
systemctl stop/restart只影响目标单元, 不会波及其它服务。这正是 2026-09-28 systemd 化要解决的问题(此前必须按 PID 手工 kill)。 详见第 8 章场景 D(历史做法)。
4. 日常操作¶
检查状态¶
ssh root@192.168.31.29 'systemctl is-active flexlm-cadence.service flexlm-synopsys.service
systemctl show -p Id,ActiveState,SubState,MainPID,UnitFileState flexlm-cadence.service flexlm-synopsys.service
ss -lntp | grep -E ":5280|:5281|:2700|:2701"'
预期:两行 active;MainPID 分别指向各自的 lmgrd;四个端口 LISTEN。
重启单套¶
ssh root@192.168.31.29 'systemctl restart flexlm-synopsys.service'
⚠️ 重启后约 60–70 秒才能恢复监听(见场景 C),不要以为失败而反复重启。
就绪判据(用端口而非进程判定):
ssh root@192.168.31.29 '
for i in $(seq 1 30); do
ss -lnt 2>/dev/null | grep -q ":2701" && { echo "READY after ~$((i*5))s"; break; }
sleep 5
done'
停止单套¶
ssh root@192.168.31.29 'systemctl stop flexlm-cadence.service
sleep 2
systemctl show -p ActiveState,SubState,Result flexlm-cadence.service'
预期:inactive / dead / success(unit 内已声明 SuccessExitStatus=15,lmgrd 收 SIGTERM 后
exit(15) 属正常码)。
停服影响:该厂商全部客户端会断开连接,正在跑的作业可能失败——先确认无人使用。
查看日志¶
ssh root@192.168.31.29 'journalctl -u flexlm-synopsys.service -n 50 --no-pager'
ssh root@192.168.31.29 'tail -50 /opt/FlexLM/Synopsys/lmgrd.log'
两条日志都值得看:journal 记录 systemd 层面的启停/退出码;lmgrd.log 记录 FlexNet 层的
feature 注册、OUT:/IN: 取用记录。
5. 配置管理¶
| 配置 | 位置 | 说明 |
|---|---|---|
| 单元定义 | /etc/systemd/system/flexlm-{cadence,synopsys}.service |
本次交付的版本另存于 units/ |
| 关键参数 | ExecStart=… lmgrd -z -c <license> -l <log> |
-z 必须保留——去掉会让 lmgrd 自行 fork,Type=simple 下 systemd 会误判主进程退出 |
| 退出码声明 | SuccessExitStatus=15 |
不可删——删除后 stop 状态会变 failed |
| license | /opt/FlexLM/{Cadence/cds.license.dat,Synopsys/Synopsys.dat} |
见各自 RUNBOOK |
修改单元后:
ssh root@192.168.31.29 'systemctl daemon-reload'
daemon-reload 不会重启运行中的服务,新配置在下次 stop/restart 时生效——因此可以
在不停服的情况下修 Cadence 的单元定义。
部署新版本单元(幂等)¶
scp units/flexlm-cadence.service units/flexlm-synopsys.service root@192.168.31.29:/etc/systemd/system/
ssh root@192.168.31.29 'chmod 644 /etc/systemd/system/flexlm-*.service && systemctl daemon-reload && systemctl enable --now flexlm-cadence.service flexlm-synopsys.service'
重复执行无副作用(enable 已启用时保持原状,--now 对已运行单元不重启)。
6. 备份与恢复¶
- 备份策略:单元文件为文本且随交付目录纳管,无独立定期备份。
- 备份位置:本主题
backup/,台账见backup/README.md。 - 恢复单元文件:
scp units/flexlm-cadence.service units/flexlm-synopsys.service root@192.168.31.29:/etc/systemd/system/
ssh root@192.168.31.29 'systemctl daemon-reload && systemctl restart flexlm-synopsys.service'
- 回滚到裸进程方式:见
docs/SOP.md第 7 章。
7. 监控与告警¶
当前无监控、无告警——这是已知限制。systemd 仅能做到"进程异常退出时自动重启", 无法发现"进程活着但不发许可"。
建议至少每日一次人工巡检:
| 指标 | 命令 | 正常值 |
|---|---|---|
| 单元状态 | ssh root@192.168.31.29 'systemctl is-active flexlm-cadence flexlm-synopsys' |
两个 active |
| 单元结果 | ssh root@192.168.31.29 'systemctl show -p Result flexlm-cadence.service flexlm-synopsys.service' |
两个 success |
| 端口 | ssh root@192.168.31.29 'ss -lnt \| grep -cE ":5280\|:5281\|:2700\|:2701"' |
4 |
| 服务端应答 | ssh root@192.168.31.29 '/opt/FlexLM/Synopsys/lmutil lmstat -c 2700@192.168.31.29 \| grep -c "UP"' |
≥2 |
后续可加 systemd timer + 探活脚本(见第 11 章待办)。
8. 故障处置¶
场景 A:单元 failed 且未自动恢复¶
症状:systemctl is-active 返回 failed;journalctl 显示 Failed with result 'exit-code'。
诊断
ssh root@192.168.31.29 'systemctl status flexlm-synopsys.service -n 20 --no-pager'
ssh root@192.168.31.29 'journalctl -u flexlm-synopsys.service -n 40 --no-pager'
ssh root@192.168.31.29 'tail -30 /opt/FlexLM/Synopsys/lmgrd.log'
处置:看 lmgrd.log 定位——license 语法错误 / HostID 不匹配 / license 过期,按
synopsys_license_20260928/docs/RUNBOOK.md 场景 B 处理;若是配置问题,修正后
systemctl restart。
注意:若已被 StartLimitBurst 拦下(journal 出现 start request repeated too quickly),
需 systemctl reset-failed flexlm-synopsys.service 后再启动。
场景 B:单元 active 但端口不监听¶
症状:systemctl is-active 为 active,但 ss 看不到端口。
诊断
ssh root@192.168.31.29 'tail -20 /opt/FlexLM/Synopsys/lmgrd.log
ss -ant | grep -E ":2700|:2701"'
处置:若日志出现 The TCP port number … is already in use,即为 TIME-WAIT,属正常,
等 60–70 秒自愈(见场景 C)。若无该日志且端口长期不监听,检查是否有其它进程占用:
ss -lntp | grep -E ":2700|:2701"。
场景 C:重启后长时间不恢复(KNOWN,非故障)¶
症状:systemctl restart 后 active,但 1 分钟内 lmstat 连不上。
根因(已实测):被停掉的 lmgrd 持有过客户端连接,其 socket 进入 TIME-WAIT;lmgrd
未使用 SO_REUSEADDR,无法立即 bind 同名端口,于是在日志中打印
(lmgrd) The TCP port number in the license, 2700, is already in use.
(lmgrd) Retrying for about 5 more minutes
处置:等待即可,实测约 60–70 秒后自动绑上,无需任何干预。切勿在此期间反复重启 (每次重启都会重新触发等待)。
验证:ss -lntp | grep :2701 出现 LISTEN,且 vendor daemon 与其并列。
场景 D:按名杀进程的历史做法(已废弃,仅作应急参考)¶
⚠️ systemd 化之前停服需按 PID 手工 kill,因为机器上有两个 lmgrd,
pkill lmgrd会同时 杀掉两套。systemd 化后请改用systemctl stop <unit>,不要再用下面的做法。 仅当 systemd 不可用(如回滚到裸进程后)才参考:
ssh root@192.168.31.29 'for p in $(pgrep -x lmgrd); do
cmd=$(tr "\0" " " < /proc/$p/cmdline)
case "$cmd" in
*Cadence/cds.license.dat*) kill "$p" ;;
*Synopsys/Synopsys.dat*) kill "$p" ;;
esac
done'
坑:用 pgrep -x(进程名精确匹配),不要用 pgrep -f/pkill -f——SSH 脚本自身命令行
含这些路径字符串,-f 会匹配到脚本自己并杀掉会话。
9. 安全与权限¶
- 服务以 root 运行(FlexLM 传统部署)。
lmgrd启动时会在日志提示"running as root is a potential security problem"——沿用既有部署方式,本次未改变安全姿势。 - 单元文件权限
644、属主root:root。 - license 文件含 HostID 与签名段,属敏感信息:不外传、不贴公开渠道。
- 无独立账号体系;访问控制依赖主机 SSH 权限(root 免密,仅管理员本机)。
10. 容量与性能¶
- 资源占用极低:两个单元合计常驻 4 个进程,内存约数 MB。
- 启动耗时:lmgrd 绑定端口受 TIME-WAIT 影响约 10–70 秒;vendor daemon 加载 feature (Synopsys 2847 条)约 30–70 秒。
- 已知瓶颈:各自单点,无冗余。
11. 附录¶
- 相关文档:
docs/SOP.md(本主题变更档案)synopsys_license_20260928/docs/RUNBOOK.md(Synopsys 许可服务:license 内容、故障场景)../Cadence/license_srv_20260926/docs/RUNBOOK.md(Cadence 许可服务)- 待办:
- 探活告警:
systemd timer+ 探活脚本,异常时写 journal / 发 Webhook(31.29 已实测可出网)。 当前最大盲区是"进程活着但不发许可"。 lmgrd.log增长:长期运行需纳入 logrotate。- Triad 冗余:须厂商签发含 3 行
SERVER的 license。 - 修订记录:
- 2026-09-28 首次建立(两套服务 systemd 化完成并验证后)。
来源:
/home/rain/Documents/eda_tools_ins/Synopsys/flexlm_systemd_20260928/docs/RUNBOOK.md| 最后更新:2026-09-28 13:25(由build/sync.py同步,请勿在站点侧修改)