Systemd服务在http请求时失败

问题描述 投票:1回答:1

我有.NET Core 3.1可执行文件,已编译为依赖于框架/可移植的框架。我正在安装了.NET Core Runtime的CentOS服务器上运行它。在终端中执行该应用程序时,它可以正常工作,但是当我使用systemd从.service文件执行时,在执行http请求时,它始终“冻结”。

这是.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应用程序似乎没有崩溃,而是“冻结”,然后设置了服务中的重新启动计时器,从而导致应用程序重新启动。

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

c# .net .net-core centos7 systemd
1个回答
0
投票

我终于找到了解决方法。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.