Systemd 服务在 http 请求时失败

Systemd service fails at http request

我有 .NET Core 3.1 可执行文件,编译为框架依赖/可移植。我在安装了 .NET Core Runtime 的 CentOS 服务器上 运行 安装它。该应用程序在终端中执行时完全正常,但是当我使用 systemd 从 .service 文件执行时,在执行 http 请求时它总是 "freezes" 。

这是 .NET 代码:

//Systemd - Bug hunting
Console.WriteLine("starting download..");
var c = new HttpClient();
var _download = await c.GetStringAsync("https://www.google.com");
Console.WriteLine($"Downloaded {_download.Length} characters.");
//---------------------

在 CLI 中 运行 时的控制台输出:

starting download..
Downloaded 47466 characters.

符合预期..

但是,如果我 运行 来自服务,控制台输出(来自 journalctl)如下所示:

Jan 18 23:34:13 myvps.local mydaemon[1385]: starting download..
Jan 18 23:34:23 myvps.local systemd[1]: mydaemon.service holdoff time over, 
scheduling restart.
Jan 18 23:34:23 myvps.local systemd[1]: Stopped My Daemon Service.
Jan 18 23:34:23 myvps.local systemd[1]: Started My Daemon Service.

然后重新开始。

可能值得一提的是,这段 C# 代码是在单独的线程中执行的。

这是服务配置文件(/etc/systemd/system/mydaemon.service):

[Unit]
Description=My Daemon Service

[Service]
WorkingDirectory=/home/myuser/applicationDir
ExecStart=/usr/bin/dotnet /home/myuser/applicationDir/mydaemon.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=mydaemon
User=myuser
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WantedBy=multi-user.target

据我观察,该服务无法发送任何 http 请求。我尝试了多次,每次都得到相同的结果。 dotnet 应用程序似乎没有崩溃,而是 "freezes" 然后服务的重新启动计时器设置,导致应用程序重新启动。

我需要如何配置我的服务才能正常工作?

我终于找到了解决办法。

问题是 http 请求发生在一个单独的线程中,导致 systemd 认为主进程已经退出。我尝试通过将 Type=forking 添加到服务配置文件来解决此问题,但没有效果。

作为解决方法,我只是在主线程的末尾添加了一个 while 循环,用于记录一些信息。这样主进程永远不会结束,因此 systemd 不会失败。

我知道这并不是最好的解决方案,但它是唯一对我有用的解决方案。

没有看到应用程序的代码在做什么......如果你提到的 "another thread" 是一个任务(它应该是,不要使用裸线程)你应该 Task.WaitAll所有其他 threads/longrunning 任务。

在所有子线程都消失之前,主线程不应退出。