我的进程有时会像启动后的dllnotfound一样抛出异常。我有一个监控服务,负责维护流程的一致状态。
如何使用Windows服务跟踪进程状态。
是否有一个Windows服务的开源实现,用于维护/跟踪Windows中的进程状态。
答案 0 :(得分:2)
编辑:所以实际问题并不是流程正在消亡,而是流程停留在异常处理程序对话框中,等待用户点击调试或取消。该问题的解决方案是禁用.net JIT调试对话框,这里的说明 http://weblogs.asp.net/fmarguerie/archive/2004/08/27/how-to-turn-off-disable-the-net-jit-debugging-dialog.aspx
我原来提出的解决方案如下
不是窗口服务,但这是一个非常容易编写的.NET程序。
使用System.Diagnostics.Process获取要检查的进程的Process对象。如果要打开现有流程,可以使用GetProcessByName
。如果从C#创建进程,那么您将拥有进程对象。
然后你可以WaitForExit
在Process
对象上有或没有超时。或测试HasExited
属性,或注册Exited
回调。进程退出后,您可以检查ExitCode
属性以确定进程是否返回错误值。
答案 1 :(得分:2)
这是不可能的,例外是线程的本地例外,如果未处理,则为进程辅助的本地例外。未处理的异常将终止该进程。您可以从这样一个死进程中获取的唯一弹片是进程退出代码。应将其设置为0xe0434f4e,这是非托管异常的异常代码。没有其他相关信息可用,除非在进程中有未处理的异常处理程序记录状态。这种状态非常不可靠,这个过程遭受了重大的心脏病发作。
保持多个进程同步并在可能因异常而死的情况下正常运行非常困难。只有死亡可以被可靠地检测到,避免做更多的事情。
答案 2 :(得分:1)
让您的流程向系统的应用程序日志写入事件和例外,并让您的监视器定期检查条目以查找与您的流程相关的事件,并且您可以检查系统事件以了解服务启动和停止事件。
如果进程本身是一个Windows服务,您可以使用`System.ServiceProcess.ServiceController'检查其状态。
答案 3 :(得分:0)
答案 4 :(得分:0)
在DllNotFoundException和启动时发生的其他事情的情况下,您可以让应用程序指示它何时完成启动。例如,它是否为文件写了时间戳。您的监视器可以将应用程序开始的时间与文件中的时间进行比较。
答案 5 :(得分:-1)
您可以做的一件事是监控进程的CPU使用情况。我假设当抛出异常时你的进程消失了。因此,进程的CPU使用率应为0,因为它不再可用。因此,如果CPU使用率在一段时间内保持为零,则可以安全地假设该进程已引发异常。这种方法不是万无一失的,因为您的决策是基于CPU使用率而且合法进程在给定的时间段内可能没有CPU使用率。您可以在监视服务中包含此检查,也可以编写一个简单的VB脚本来检查外部进程CPU使用情况。