如何将含Vimba API的应用配置为Ubuntu服务?(遇传输层错误)
解决Ubuntu服务运行Vimba应用时的“No Transport Layer”错误
问题分析
手动运行App.sh正常,但服务启动报错,核心原因是服务运行环境与用户登录环境存在差异,主要涉及路径配置、环境变量加载、设备权限三个方面。
具体修复步骤
1. 修正systemd服务文件的路径错误
你的服务配置中ExecStart存在两个问题:
- 路径缺少用户目录前缀:指定
User=jetson1后,服务会以jetson1身份运行,路径需改为/home/jetson1/Desktop/App/App_Scripts/App.sh - 末尾多了斜杠:脚本路径不能以斜杠结尾
修正后的[Service]段:
[Service] Type=simple Restart=always RestartSec=6 User=jetson1 ExecStart=/home/jetson1/Desktop/App/App_Scripts/App.sh
2. 在服务中加载Vimba必需的环境变量
手动运行时,用户shell会加载Vimba的环境变量(通常在~/.bashrc或Vimba安装目录的Vimba.sh中),但systemd服务默认不会加载这些变量。解决方法二选一:
- 方法一:在App.sh开头添加Vimba环境变量导入
在App.sh的最顶部添加:# 替换为你的Vimba实际安装路径 source /opt/Vimba_6/Vimba.sh - 方法二:在systemd服务文件中添加环境变量
在[Service]段添加:Environment="GENICAM_GENTL64_PATH=/opt/Vimba_6/VimbaGigETL/CTI/x86_64bit" Environment="PATH=/opt/Vimba_6/VimbaGigETL/CTI/x86_64bit:$PATH" # 根据你的架构调整路径,arm64则替换为arm_64bit
3. 确保服务用户拥有相机设备访问权限
Allied Vision相机需要udev规则赋予普通用户设备访问权限:
- 检查Vimba安装目录下的udev规则文件(通常是
99-alliedvision.rules),将其复制到/etc/udev/rules.d/:sudo cp /opt/Vimba_6/config/99-alliedvision.rules /etc/udev/rules.d/ - 重新加载udev规则并触发设备更新:
sudo udevadm control --reload-rules sudo udevadm trigger - 确保jetson1用户加入
video组:sudo usermod -aG video jetson1
4. 优化启动脚本的可靠性
原启动脚本中$(whoami)在服务环境下可能出现不可预期的结果,建议直接写死用户路径,或者使用$USER变量:
#!/bin/sh user="jetson1" if [ X"$(uname -m)" = X"x86_64" ] then arch="x86_64" elif [ X"$(uname -m)" = X"aarch64" ] then arch="arm_64" fi echo $user echo $arch /home/${user}/Desktop/App/App_Scripts/bin/${arch}bit/changeName jetson1 /home/${user}/Desktop/App/App_Scripts/App.sh
5. 查看服务日志排查细节
执行以下命令查看服务实时日志,获取更多错误信息:
journalctl -u App.service -f
日志中可能会暴露库文件缺失、设备无法打开等更具体的问题,帮助进一步定位。
验证修复
- 重新加载systemd配置:
sudo systemctl daemon-reload - 重启服务:
sudo systemctl restart App.service - 检查服务状态:
sudo systemctl status App.service
内容的提问来源于stack exchange,提问作者Ecrin Yıldız
相关产品推荐
相关产品推荐

