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