"Always running" 控制台应用程序

"Always running" console application

我编写了一个控制台应用程序,目前 运行正在服务器上运行。它不需要任何用户输入(除了可以通过启动参数完成的启动参数)。

不幸的是,这个解决方案很糟糕,因为有人可能会不小心将其关闭(即,当使用远程桌面连接连接到服务器时,然后注销而不是简单地断开连接)。我一直需要它运行。

一种解决方案是将其变成windows服务,但到目前为止使用SC或第三方工具如nssm或RunAsService失败(SC和Nssm创建服务但无法启动此类服务)。

我可以完全重写我的程序,使其成为一个合适的服务...但老实说,我正在为此苦苦挣扎(从我读到的不推荐的做法来看)。

最后我可以将它保留为控制台应用程序并使用任务调度程序 运行 它 - 这看起来确实是一个不错的解决方案,但是(就像我提到的那样)我需要它 运行一直(它可以关闭和打开 - 非常短的停机时间不是问题)。

我可以寻求任何有关设置此类任务的帮助吗?

已解决

经过几次尝试,我使用 Topshelf andthis great guide.

将它变成了服务

编写功能性 windows 服务需要遵循许多规则,包括但不限于

  • 能够在特定时间内完成初始化过程
  • 对线程的大致了解

编写 windows 服务本身并没有什么不好,他们只是需要更多的努力和安装程序。

根据您的描述,预定的工作似乎符合您的要求

如果您不想将您的控制台应用程序重新写入 windows 服务并希望它一直是 运行,我能看到的唯一解决方案是:

  • 创建一个小型 window 服务,检查您的 控制台进程 是否 运行。

  • 如果发现没有Console进程,那就启动一个新的。

    Process[] pname = Process.GetProcessesByName("YourConsoleApp.exe");
    if (pname.Length == 0)
       Process.Start("YourConsole.exe")
    else
        //Do nothing 
    

您可以使用两种方法在 windows 中不断地 运行 .net 程序。两者各有优缺点。

Windows 服务

  • 推荐的解决方案
  • 计算机上的启动服务会启动(不需要有人登录)
  • 以重启的形式进行一些(有限的)错误处理
  • 适用于非常可靠的服务,可以 运行 长时间
  • 服务处理自己的状态
  • 由于内存泄漏很容易崩溃

IIS 应用程序服务器

  • 不推荐的解决方案
  • 以 windows 开头,但可能无法启动您的应用程序
  • 需要更新的 windows 以允许始终开启配置
  • Always on 配置复杂
  • 状态由 IIS 处理
  • 更好地适应糟糕的编程,因为 IIS 将为您重新启动
  • IIS 也可能会为您终止线程(因此您的调度程序将停止工作)

我怀疑您被告知不推荐 windows 服务的原因是它可能会因内存泄漏而崩溃。但是这个问题无论如何都会发生,因为你的程序需要 运行 很长时间(这不是 windows 服务的问题,而是长期存在的进程)。