【问题标题】:Start and monitor multiple instances of one process in Windows在 Windows 中启动和监控一个进程的多个实例
【发布时间】:2014-01-09 10:19:35
【问题描述】:

我有一个 Windows 应用程序,我需要使用不同的命令行参数运行多个实例。该应用程序非常不稳定,并且每 48 小时左右就会崩溃一次。

由于手动检查故障并在出现故障时重新启动不是我喜欢做的事情,所以我想为此编写一个“管理器程序”。它会启动程序(它的所有实例)然后观察它们。如果进程崩溃,它将重新启动。

在 Linux 中,我可以使用 fork()s 和 pid 来实现这一点,但这显然在 Windows 中不可用。那么,我应该尝试实现 CreateProcess 版本还是有更好的方法?

【问题讨论】:

  • 您的应用程序需要交互还是可以作为守护进程运行?
  • 可以,只有我一个人用。

标签: windows process


【解决方案1】:

当您调用CreateProcess 时,您将在传递给CreateProcess 的进程信息结构的hProcess 成员中返回新进程的句柄。您可以使用此句柄来检测进程何时终止。

例如,您可以创建另一个线程并调用WaitForSingleObject(hProcess) 并阻塞直到进程终止。然后你可以决定是否重新启动它。

或者您可以致电GetExitCodeProcess(hProcess, &exitcode) 并测试exitcode。如果它的值为STILL_ACTIVE,那么您的进程尚未终止。这种基于GetExitCodeProcess 的方法需要轮询。

【讨论】:

  • 我已经测试了第一种方法,它看起来很简单,但是对于 Windows,崩溃的进程似乎并没有真正终止,直到用户单击该错误对话框中的“关闭程序”按钮(不稳定的应用程序是一个 GUI 程序),所以我无法通过这种方式捕获此类事件。
  • 好的。您需要根据什么标准来决定一个进程“崩溃”。
  • 我做的基本测试是我创建了一个“主”进程,它启动了一个“子”进程,它休眠了 3 秒,然后尝试除以 0,当然会崩溃,但这是在我单击此“结束程序”按钮之前,父母不会将其识别为“终止”。这或多或少是我需要监控的 GUI 程序所发生的。
  • 就像我说的那样,您需要找到一种方法来检测处于不良状态的进程。没有一种方法可以做到这一点。
  • 好吧,对于有同样问题的人:如果您使用这种方法并按照此处所述禁用 Windows 错误对话框:stackoverflow.com/questions/396369/… 它应该可以正常工作。
【解决方案2】:

如果它可以作为守护程序运行,确保它继续运行的最简单方法是Non-Sucking Service Manager

它将允许作为未设计为服务的 win32 服务应用程序运行。如有必要,它将监视并重新启动。如果需要任何定制,源代码也包括在内。

您需要做的就是将每个实例定义为一个服务,并使用所需的参数,其余的由它来完成。

如果您有某种安全警察限制并且不能使用第三方工具,那么编码将是必要的。 David Heffernan 的回答为您提供了合适的方向。

或者它可以批量、vbs 或 js 完成,而不需要系统外的任何东西。 WMI Win32_Process 类应该允许您处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2020-06-28
    • 1970-01-01
    • 2016-01-30
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多