我有.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应用程序似乎没有崩溃,而是“冻结”,然后设置了服务中的重新启动计时器,从而导致应用程序重新启动。
我需要如何配置我的服务才能正常工作?
答案 0 :(得分:0)
我终于找到了解决方法。
问题是http请求发生在单独的线程中,导致systemd认为主进程已退出。我尝试通过将Type=forking
添加到服务配置文件来解决此问题,但是没有任何效果。
作为一种解决方法,我只是在主线程的末尾添加了一个while循环,用于记录一些信息。这样,主进程永无止境,因此systemd不会失败。
我知道这并不是最好的解决方案,但这是唯一对我有用的解决方案。
答案 1 :(得分:0)
没有看到应用程序的代码在做什么……如果您提到的“另一个线程”是一个Task(应该是,不要使用裸线程),则应该将Task.WaitAll用于所有其他线程/长时间运行的任务。
主线程的所有子线程都消失后才退出。