You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何排查Ubuntu 22.04上.NET 7应用无法启动的问题?

.NET 7应用在Ubuntu 22.04无法启动的排查方案

问题背景

在Ubuntu 22.04上部署.NET 7应用后,systemd服务启动后很快自动停用;手动进入应用目录执行sudo dotnet MyApp.dll无任何响应。已确认.NET环境正常,相关信息如下:

dotnet --info

.NET SDK:
 Version:   7.0.105
 Commit:    e1bc5e001c

Runtime Environment:
 OS Name:     ubuntu
 OS Version:  22.04
 OS Platform: Linux
 RID:         ubuntu.22.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]

Other architectures found:
  None

Environment variables:
  DOTNET_ROOT       [/usr/lib/dotnet]

global.json file:
  Not found

systemd服务配置:

[Unit]
Description=My App

[Service]
Type=simple
WorkingDirectory=/var/myapp
Restart=on-failure
RestartSec=10
ExecStart=/usr/bin/dotnet /var/myapp/MyApp.dll
KillSignal=SIGINT
SyslogIdentifier=dotnet-project1
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

服务状态及日志:

sudo systemctl status myapp

myapp.service - My App
Loaded: loaded (/etc/systemd/system/myapp.service; enabled; preset: enabled)
Active: activating (auto-restart) since Wed 2023-06-14 01:29:49 UTC; 9s ago
Process: 58543 ExecStart=/usr/bin/dotnet /var/myapp/MyApp.dll (code=exited, status=0/SUCCESS)
Main PID: 58543 (code=exited, status=0/SUCCESS)
    CPU: 880ms

Jun 14 01:29:49 localhost systemd[1]: myapp.service: Deactivated successfully.

手动运行时的journalctl日志:

Jun 14 02:09:06 localhost sudo[61729]: myuser : TTY=pts/1 ; PWD=/home/myuser/MyApp/publish ; USER=root ; COMMAND=/usr/bin/dotnet MyApp.dll
Jun 14 02:09:06 localhost sudo[61729]: pam_unix(sudo:session): session opened for user root(uid=0) by myuser(uid=1000)
Jun 14 02:09:07 localhost sudo[61729]: pam_unix(sudo:session): session closed for user root

排查步骤

1. 捕获应用的标准输出/错误日志

当前systemd仅记录自身状态,未捕获应用的实际输出。修改服务配置,将应用日志重定向到文件:

  • 编辑systemd配置文件(/etc/systemd/system/myapp.service),在[Service]段添加:
    StandardOutput=append:/var/log/myapp/out.log
    StandardError=append:/var/log/myapp/err.log
    
  • 创建日志目录并设置权限:
    sudo mkdir -p /var/log/myapp
    sudo chown -R root:root /var/log/myapp  # 匹配systemd默认运行用户
    
  • 重新加载配置并重启服务:
    sudo systemctl daemon-reload
    sudo systemctl restart myapp
    
  • 查看错误日志:cat /var/log/myapp/err.log,这通常会包含应用启动失败的具体原因。

2. 检查应用目录权限与文件完整性

  • 确认应用目录下所有文件的权限,确保systemd运行用户(默认root)有读取权限:
    sudo ls -la /var/myapp
    
  • 对比本地开发环境的发布文件,确认服务器上的/var/myapp目录下文件完整,无缺失(比如配置文件appsettings.json、依赖库等)。

3. 启用.NET详细日志输出

通过环境变量开启.NET的调试日志,获取更详细的启动过程信息:

  • 在systemd配置的[Service]段添加:
    Environment=DOTNET_LOG_LEVEL=Debug
    
  • 重启服务后,实时查看日志:
    journalctl -u myapp -f
    

4. 切换到开发环境运行

生产环境下应用可能会屏蔽错误输出,切换到开发环境尝试启动:

  • 手动运行时设置环境变量:
    sudo ASPNETCORE_ENVIRONMENT=Development dotnet /var/myapp/MyApp.dll
    
  • 或者修改systemd配置中的ASPNETCORE_ENVIRONMENT为Development,重启服务后查看日志。

5. 检查应用依赖的系统库

使用ldd命令检查.NET运行时依赖的系统库是否存在:

ldd /usr/lib/dotnet/shared/Microsoft.NETCore.App/7.0.5/libcoreclr.so

如果出现not found的库,需要安装对应的系统包(比如libicu-dev、libssl-dev等)。

6. 确认应用的发布模式

  • 检查发布时是否使用了正确的RID:dotnet publish -c Release -r ubuntu.22.04-x64
  • 如果是自包含发布,确认发布包完整,且目标平台与服务器匹配;如果是依赖框架发布,确保服务器上的.NET运行时版本与发布时的目标版本一致。

内容的提问来源于stack exchange,提问作者Scottish Smile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:12:46