在 Linux 系统上使用 systemd 管理 .NET Web API 服务,启动sudo systemctl start vkt.api 无任何反馈,表现为命令行卡住,无输出信息。使用命令行查看状态systemctl status vkt.api.service
有以下内容
● vkt.api.service - Vkt API Service
Loaded: loaded (/etc/systemd/system/vkt.api.service; disabled; preset: enabled)
Active: activating (start) since Fri 2025-07-11 07:44:44 UTC; 30s ago
Main PID: 40799 (dotnet)
Tasks: 35 (limit: 4527)
Memory: 170.8M (peak: 171.3M)
CPU: 3.137s
CGroup: /system.slice/vkt.api.service
└─40799 dotnet /var/www/vkt.api/vkt.api.dll
原因分析
服务类型不匹配:.NET 应用需要明确告知 systemd 它已完全启动就绪
缺少就绪通知:默认配置下 systemd 不知道应用何时完成初始化
日志误判:应用可能已监听端口但未通知 systemd
解决方案
步骤 1:启用 .NET 的 systemd 集成,需要改程序的代码如下:
在项目中添加 systemd 集成包,使用Nuget 添加包引用 :Microsoft.Extensions.Hosting.Systemd
或者使用命令行:
dotnet add package Microsoft.Extensions.Hosting.Systemd
并修改 Program.cs 代码如下:
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSystemd(); // 添加这行启用 systemd 集成
发布完成后再次使用sudo systemctl start vkt.api反馈如下:
[root@localhost xx]# sudo systemctl start vkt.api
[root@localhost xx]# sudo systemctl status vkt.api
● vkt.api.service - Vkt API Service
Loaded: loaded (/etc/systemd/system/vkt.api.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2025-07-16 14:25:34 CST; 17s ago
Main PID: 28689 (dotnet)
Tasks: 25
Memory: 117.8M
CGroup: /system.slice/vkt.api.service
└─28689 /usr/bin/dotnet /var/www/vkt.api/vkt.api.dll