【发布时间】:2019-01-06 12:49:38
【问题描述】:
所以我使用.net-core 开发了一个应用程序,我在Linux 机器上使用systemd 将这个软件作为daemon 服务运行。现在的问题是,当应用程序中发生错误时,它会进入“边缘”,实际上应用程序的每个活动都是使用Console.WriteLine 记录的,我可以看到这个日志在 linux 机器上键入该命令:journalctl -fu app.service。
当错误发生时,日志不会写入任何内容,但同时应用程序会继续运行,这真的很奇怪,因为我使用以下配置设置了服务:
[Unit]
Description = Daemon service
[Service]
ExecStart = /usr/bin/dotnet /home/my username/Desktop/publish/SimpleApp.dll
WorkingDirectory= /home/foo/Desktop/publish
Restart = always
RestartSec = 3
[Install]
WantedBy = multi-user.target
如您所见,Restart = always 应在出现错误时重新启动应用程序。当引发异常时,Error() 方法将错误写入文件中,然后按以下方式终止软件:
public void Error(Exception ex)
{
File.WriteAllText("error.txt", ex.ToString());
Environment.Exit(1);
}
Environment.Exit 的 Linux 环境一定有问题,否则我调用 Environment.Exit 时做错了。还有其他方法可以关闭像这样作为系统服务运行的应用程序吗?
谢谢
【问题讨论】:
-
在我看来,您捕获了异常,但没有抛出新错误。这意味着系统不知道发生了错误
-
@Aldert 你提出解决方案了吗?
-
有几件事:(a) 你确定
Error()真的被调用了吗?`error.txt文件是否存在? (b) 从一个守护进程不要假设相对路径,使用/tmp/error.txt或/var/error.txt或类似的。 (c) 我不会假设Environment.Exit()不起作用。而是由systemd立即重新启动您的应用程序(因此在您的配置中使用Restart = always)。
标签: c# linux .net-core systemd