.NET 7发布的应用在Ubuntu 23.04无法运行,求排查方案
问题排查:.NET 7双项目解决方案发布后无法运行(Ubuntu 23.04)
项目结构
/Project1 - Project1.csproject - appsettings.json /Project2 - Project2.csproject - appsettings.json MySolution.sln
发布操作及输出
执行的发布命令:
dotnet publish 'MySolution.sln' --self-contained false -r linux-x64 -c Release -o publish
命令输出:
MSBuild version 17.4.3+7e646be43 for .NET Determining projects to restore... All projects are up-to-date for restore. Project1 -> /home/myuser/mysolution/project1/bin/Release/net7.0/linux-x64/Project1.dll Project1 -> /home/myuser/mysolution/publish/ Project2 -> /home/myuser/mysolution/project1/bin/Release/net7.0/linux-x64/Project2.dll Project2 -> /home/myuser/mysolution/publish/
发布后/publish目录包含代码,但应用无法运行,直接执行dotnet Project1.dll --verbosity=diagnostic无任何输出。
应用Kestrel端口配置
Project1/appsettings.json
"AllowedHosts": "*", "Kestrel": { "Endpoints": { "Http": { "Url": "http://localhost:5001" }, "Https": { "Url": "https://localhost:5001" } } }
Project2/appsettings.json
"AllowedHosts": "*", "Kestrel": { "Endpoints": { "Http": { "Url": "http://localhost:5002" }, "Https": { "Url": "https://localhost:5002" } } }
当前.NET环境信息
.NET SDK: Version: 7.0.105 Commit: e1bc5e001c Runtime Environment: OS Name: ubuntu OS Version: 23.04 OS Platform: Linux RID: ubuntu.23.04-x64 Base Path: /usr/lib/dotnet/sdk/7.0.105/ Host: Version: 7.0.5 Architecture: x64 Commit: 8042d61b17 .NET SDKs installed: 7.0.105 [/usr/lib/dotnet/sdk] .NET runtimes installed: Microsoft.AspNetCore.App 7.0.5 [/usr/lib/dotnet/shared/Microsoft.AspNetCore.App] Microsoft.NETCore.App 7.0.5 [/usr/lib/dotnet/shared/Microsoft.NETCore.App]
Systemd服务配置
创建的/etc/systemd/system/project1.service文件内容:
[Unit] Description=Project1 [Service] Type=simple WorkingDirectory=/home/myuser/ Restart=on-failure RestartSec=10 ExecStart=/usr/bin/dotnet /home/myuser/mysolution/project1/bin/Release/net7.0/linux-x64/Project1.dll KillSignal=SIGINT SyslogIdentifier=dotnet-project1 Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install] WantedBy=multi-user.target
服务启动后瞬间停止。
排查步骤
- 检查发布目录配置文件覆盖问题:两个项目发布到同一个
publish目录,appsettings.json会被后发布的项目覆盖,导致应用读取错误的配置。需分别发布到独立目录测试。 - 单独发布单个项目:执行以下命令分别发布两个项目,再单独启动测试:
进入对应目录执行dotnet publish Project1/Project1.csproj --self-contained false -r linux-x64 -c Release -o publish-project1 dotnet publish Project2/Project2.csproj --self-contained false -r linux-x64 -c Release -o publish-project2dotnet Project1.dll或dotnet Project2.dll,观察是否有输出。 - 强制输出启动日志:设置日志环境变量后再启动,获取详细错误信息:
export ASPNETCORE_LOGGING__LOGLEVEL__DEFAULT=Debug export ASPNETCORE_LOGGING__CONSOLE__ENABLED=true dotnet Project1.dll - 确认工作目录与配置文件路径:运行应用时确保当前工作目录包含
appsettings.json,或手动指定配置文件路径:dotnet Project1.dll --configuration /path/to/Project1/appsettings.json - 修正Systemd服务配置:
- 将
WorkingDirectory修改为应用所在目录(如/home/myuser/mysolution/project1/bin/Release/net7.0/linux-x64/),确保服务能读取配置文件。 - 添加
User=myuser配置项,避免用root权限运行,同时确保该用户对应用目录有读写权限:[Service] # 新增或修改以下内容 User=myuser WorkingDirectory=/home/myuser/mysolution/project1/bin/Release/net7.0/linux-x64/
- 将
- 查看Systemd服务日志:实时查看服务启动日志,定位失败原因:
journalctl -u project1.service -f - 检查端口占用:确认配置的端口未被其他进程占用:
ss -tulpn | grep 5001 ss -tulpn | grep 5002 - 验证RID兼容性:去掉
-r linux-x64参数重新发布,让系统自动匹配RID,避免兼容性问题:dotnet publish Project1/Project1.csproj --self-contained false -c Release -o publish-project1
内容的提问来源于stack exchange,提问作者Scottish Smile
相关产品推荐
相关产品推荐

