在Linux环境下,将FlexNet许可证服务器配置为systemd服务,是实现开机自启动和服务崩溃自动恢复的标准做法。这篇文章提供一个可直接使用的systemd服务模板,并说明关键配置项的含义。
在编写service文件之前,先完成以下准备工作:
1. 创建专用服务用户
不建议用root运行lmgrd。创建一个专用的系统用户:
bash
sudo useradd -r -s /bin/bash -m -d /opt/flexnet flexnet2. 确认lmgrd路径
找到lmgrd和vendor daemon的完整路径。以Synopsys SCL为例:
bash
# 查找lmgrd位置
which lmgrd
# 通常输出: /opt/synopsys/scl/2021.03/linux64/bin/lmgrd
# 确认vendor daemon位置
ls -l /opt/synopsys/scl/2021.03/linux64/bin/snpslmd3. 准备许可证文件和日志目录
bash
# 放置许可证文件
sudo mkdir -p /opt/flexnet/licenses
sudo cp /path/to/license.lic /opt/flexnet/licenses/
# 创建日志目录并赋予权限
sudo mkdir -p /var/log/flexnet
sudo chown -R flexnet:flexnet /opt/flexnet /var/log/flexnet创建服务文件 /etc/systemd/system/flexnet.service:
ini
[Unit]
Description=FlexNet License Server
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
User=flexnet
Group=flexnet
WorkingDirectory=/opt/flexnet
Environment="LM_LICENSE_FILE=/opt/flexnet/licenses/license.lic"
ExecStart=/opt/synopsys/scl/2021.03/linux64/bin/lmgrd -c /opt/flexnet/licenses/license.lic -l /var/log/flexnet/debug.log
ExecStop=/opt/synopsys/scl/2021.03/linux64/bin/lmutil lmdown -c /opt/flexnet/licenses/license.lic -q
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target关键配置项说明:
| 配置项 | 含义 |
|---|---|
Type=forking | lmgrd启动后会在后台运行,符合forking类型 |
User/Group | 以flexnet用户身份运行,非root,更安全 |
ExecStart | 启动命令,建议使用完整路径,-l指定日志文件位置 |
ExecStop | 停止命令,用lmdown优雅关闭,-q表示安静模式 |
Restart=on-failure | 进程异常退出时自动重启 |
RestartSec=10 | 重启前等待10秒 |
After=network-online.target | 确保网络已完全就绪后再启动 |
如果lmgrd依赖特定环境变量(如VENDOR_LICENSE_DIR),可以在service文件中指定:
ini
[Unit]
Description=FlexNet License Server with Environment
After=network-online.target
[Service]
Type=forking
User=flexnet
Group=flexnet
WorkingDirectory=/opt/flexnet
Environment="LM_LICENSE_FILE=/opt/flexnet/licenses/license.lic"
Environment="SNPSLMD_LICENSE_FILE=27000@localhost"
Environment="PATH=/opt/synopsys/scl/2021.03/linux64/bin:/usr/local/bin:/usr/bin:/bin"
ExecStart=/opt/synopsys/scl/2021.03/linux64/bin/lmgrd -c /opt/flexnet/licenses/license.lic -l /var/log/flexnet/debug.log
ExecStop=/opt/synopsys/scl/2021.03/linux64/bin/lmutil lmdown -c /opt/flexnet/licenses/license.lic -q
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=10
LimitNOFILE=65536
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target额外配置说明:
| 配置项 | 含义 |
|---|---|
ExecReload | 支持systemctl reload flexnet重新读取许可证文件 |
LimitNOFILE=65536 | 提高文件描述符限制,避免高并发时出现"Too many open files" |
Environment中设置PATH | 确保lmdown等命令能正常调用 |
1. 重新加载systemd配置
bash
sudo systemctl daemon-reload2. 启用开机自启动
bash
sudo systemctl enable flexnet3. 立即启动服务
bash
sudo systemctl start flexnet4. 查看服务状态
bash
sudo systemctl status flexnet5. 查看实时日志
bash
sudo journalctl -u flexnet -f6. 停止服务
bash
sudo systemctl stop flexnet7. 重新读取许可证文件(不重启服务)
bash
sudo systemctl reload flexnet如果systemctl start flexnet失败,按以下顺序排查:
第一步:查看systemd日志
bash
sudo journalctl -u flexnet -n 50 --no-pager第二步:以flexnet用户手动启动
切换到flexnet用户,手动执行启动命令,观察具体报错:
bash
sudo su - flexnet
/opt/synopsys/scl/2021.03/linux64/bin/lmgrd -c /opt/flexnet/licenses/license.lic -l /var/log/flexnet/debug.log如果手动启动成功但systemd启动失败,问题出在环境变量差异——systemd启动时加载的环境变量与终端不同。
第三步:在service文件中显式设置所有必要的环境变量
手动启动时报No such file or directory但文件确实存在,通常是LSB依赖缺失或32位/64位不匹配。
第四步:检查日志目录权限
确保flexnet用户对/var/log/flexnet目录有写权限:
bash
sudo chown -R flexnet:flexnet /var/log/flexnet
sudo chmod 755 /var/log/flexnet1. 不要使用Type=simple
lmgrd启动后会立即fork到后台,如果使用Type=simple,systemd会认为服务启动失败。必须使用Type=forking。
2. 避免使用-z参数
-z参数让lmgrd保持在前台运行,便于调试,但在生产环境中配合systemd使用时,应与Type=forking对应,确保服务正确进入后台。
3. ExecStop使用lmdown -q
-q参数让lmdown安静执行,避免因交互式确认导致停止命令卡住。
4. 多套FlexNet服务的处理
如果同一台服务器运行多套独立的FlexNet服务(不同软件厂商),创建多个service文件,如flexnet-synopsys.service、flexnet-cadence.service,使用不同的端口和许可证文件,避免相互干扰。
systemd服务配置的核心要点:
按照上述模板配置,FlexNet许可证服务器就能在系统重启后自动启动,并在异常崩溃时自动恢复。