.NET location: Not found:树莓派Zero 2上.NET 8服务启动失败
问题描述
树莓派Zero 2(Debian系统)上,原基于.NET Core 6开发的Web应用通过自定义systemd服务以root用户运行正常数月。升级至.NET Core 8并更新系统.NET环境后,出现两个问题:
- 通过systemd服务启动时,提示
.NET location: Not found错误 - 直接在应用目录运行可执行文件:不加
sudo正常启动,加sudo则报错
当前systemd服务配置如下:
[Unit] Description=RealiseMotion Loader [Service] Type=oneshot User=root Group=root WorkingDirectory=/usr/local/bin/RealiseMotion/web/ ExecStart=/usr/local/bin/RealiseMotion/web/RealiseMotion.Client 10001 #WorkingDirectory=/usr/local/bin/RealiseMotion/Loader/ #ExecStart=/usr/local/bin/RealiseMotion/Loader/RealiseMotion.Loader [Install] WantedBy=multi-user.target
解决方案
1. 修复root用户的.NET环境变量
普通用户能正常运行是因为.NET路径已加入其环境变量,但root用户(包括sudo和systemd服务)的环境变量未包含该路径。
先获取普通用户的.NET路径:
echo $PATH找到包含
.dotnet的路径,通常为/usr/share/dotnet或$HOME/.dotnet为root用户添加环境变量:
编辑root的配置文件:sudo nano /root/.bashrc在末尾添加:
export PATH=$PATH:/usr/share/dotnet # 替换为你实际找到的.NET路径 export DOTNET_ROOT=/usr/share/dotnet保存退出后生效配置:
source /root/.bashrc
2. 为systemd服务显式配置环境变量
systemd默认不会继承用户的完整环境变量,需在服务配置中直接指定:
修改服务配置文件(通常位于/etc/systemd/system/[你的服务名].service):
[Service] # 保留原有配置,新增以下两行 Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/share/dotnet" Environment="DOTNET_ROOT=/usr/share/dotnet"
更新配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart RealiseMotion.Loader.service
3. 验证root环境下的.NET可用性
执行以下命令确认root能正常识别.NET:
sudo dotnet --version
若仍报错,用普通用户执行which dotnet获取准确的.NET安装路径,再重复上述步骤修正。
额外优化(可选)
如果你的Web应用是长期运行的服务,建议将服务配置中的Type=oneshot改为Type=simple,并添加自动重启规则:
[Service] Type=simple Restart=always
内容的提问来源于stack exchange,提问作者Andrew Simpson
相关产品推荐
相关产品推荐

