【问题标题】:Dotnet app started as daemon doesn't working properlyDotnet 应用程序作为守护程序启动时无法正常工作
【发布时间】:2018-05-24 16:29:27
【问题描述】:

我使用NetCore开发了一个简单的应用程序,应用程序每次执行都会将内容写入一个文件,代码如下:

using System;
using System.IO;

namespace SimpleApp
{
   class Program
   {
       static void Main(string[] args)
       {
          using (StreamWriter writer = new StreamWriter("log.txt", true))
          {
              writer.WriteLine("Hello World");
          }
       }
   }
}

所以如果我以这种方式启动应用程序:dotnet SimpleApp.dll 我会得到一个带有Hello Worldlog.txt 文件。

现在,我正在尝试创建一个 linux 守护进程,我没有这方面的经验,所以我写了我在互联网上学到的东西,我创建了一个服务 cakked console.service,其中包含以下结构:

[Unit]
Description = Hello World Daemon

[Service]
ExecStart = /usr/bin/dotnet /home/my username/Desktop/publish/SimpleApp.dll
Restart = on-failure

[Install]
WantedBy = multi-user.target

所以基本上我有一个描述,我在ExecStart 中设置了我的dotnet 安装路径和应用程序的路径。

后来我有一个Install,如果理解得好,告诉systemctl,该服务可以为每个用户运行,对吧?

后来,我复制了system文件夹中的服务:

sudo cp console.service /lib/systemd/system

我启用了它:

sudo systemctl daemon-reload 
sudo systemctl enable console.service

所以,我执行了服务:

sudo systemctl start console.service

当我打印状态时:

systemctl status console.service

将显示如下:

问题是在文件夹publish(ExecStart中指定的应用程序路径)里面我现在没有log.txt。

为什么?

【问题讨论】:

    标签: c# .net linux .net-core daemon


    【解决方案1】:

    由于您只指定了文件的相对路径,它将在服务的工作目录中创建。

    您可以将"log.txt" 更改为完整路径或在.service 文件中设置工作目录:

    [Service]
    WorkingDirectory=/path/you/want/the/file/to/be/in
    …
    

    【讨论】:

    • 谢谢,只是一个小问题:假设我想将 Console.WriteLine 显示为“终端日志”,可以这样做吗?我应该在服务文件中编写一些配置还是应该编辑我的 c# 控制台?感谢您的帮助!
    • 你可以在 systemd+syslog 中做到这一点:stackoverflow.com/questions/37585758/…
    • 或使用任何 .net 日志库(例如带有滚动日志文件接收器的 serilog)(如果您使用库或想要创建独立组件,Microsoft.Extensions.Logging 充当抽象层)
    • 等等,我的意思是console.writeline生成的输出不是log.txt
    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    相关资源
    最近更新 更多