【发布时间】:2021-11-28 08:17:34
【问题描述】:
一般问题:如何从运行在同一台服务器上的网络应用中识别进程?假设我们从不同的控制台应用程序启动此过程,但我们可以将有关此过程的任何数据保存到数据库中,该数据库可供 Web 应用程序访问。
我的具体设置,以及更详细的问题描述:
-
设置:
我有一个控制台应用程序——我们称之为包装器。这个应用程序正在启动一个 CPU 繁重的进程,我们称之为计算器进程。 Wrapper 还将有关此过程的信息保存到数据库 - 一条记录。我还有一个 Web 应用程序 - 仪表板 - 显示有关服务器上所有正在运行的控制台应用程序和计算器进程的信息(从数据库中获取的信息)。 Calculator Process 完成后,Wrapper 将完成时间保存到数据库,我可以在 Dashboard 中显示它已经完成。 -
问题:
有时 Wrapper 会死掉,而 Calculator Process 也会随之消亡。当它死亡时,它不会将任何信息保存到数据库中,所以我留下了一条未完成状态的记录。 -
问题:
在 Dashbord 中,如何识别哪些未完成的记录是正在运行的计算,哪些是 Wrapper 死后的剩余记录? -
澄清:每个 Wrapper 都由某个外部代理启动/结束。每个 Wrapper 启动一个单独的 Calculator Process。 Wrapper 正在等待进程完成,然后更新数据库记录,然后退出。 Wrapper突然死掉了,那么记录没有更新,问题就出现了。
我尝试过的解决方案:
我尝试将计算器进程的 StartTime 保存到数据库中。然后在仪表板中,我尝试按名称检查所有正在运行的计算器进程,从 System.Diagnostics.Process 类中获取它们的 StartTime。我的想法是查看哪些未完成的进程与正在运行的进程具有相同的 StartTime。那就是我将能够区分正在运行的和死掉的。但我得到:
Win32Exception: Access is denied
System.Diagnostics.ProcessManager.OpenProcess(int processId, int access, bool throwIfExited)
System.Diagnostics.Process.GetProcessHandle(int access, bool throwIfExited)
System.Diagnostics.Process.GetProcessTimes()
System.Diagnostics.Process.get_StartTime()
【问题讨论】:
-
你能澄清
When Wrapper suddenly dies的意思吗?它是怎么死的? -
@the.Doc - 我认为,启动 Wrapper 的同一个外部代理有时会在它完成之前杀死它。它不在我的控制范围内。
-
您可以尝试
Win32_ProcessStartTrace或Win32_ProcessEndTrace来监控您的进程何时启动/存在。您可能需要一个后台线程/进程,但不确定 wmi 事件如何与 asp.net 一起使用。除非您有权访问服务器以安装为服务?
标签: c# .net windows asp.net-core process