跳转至

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. 服务概览
  2. 接入与凭据
  3. 日常速查表
  4. 日常操作
  5. 配置管理
  6. 备份与恢复
  7. 监控与告警
  8. 故障处置
  9. 安全与权限
  10. 容量与性能
  11. 附录

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 同步,请勿在站点侧修改)