如何识别运行进程
How to identify running process
一般问题:如何从同一服务器上的 Web 应用程序 运行 识别进程?假设我们从不同的控制台应用程序启动此过程,但我们可以将有关此过程的任何数据保存到数据库中,该数据库可由 Web 应用程序访问。
我的具体设置,以及更详细的问题描述:
设置:
我有一个控制台应用程序 - 让我们称之为包装器。此应用程序正在启动一个 CPU 繁重的进程,我们称之为计算器进程。 Wrapper 还将有关此过程的信息保存到数据库 - 一条记录。我还有一个网络应用程序 - 仪表板 - 显示有关服务器上所有 运行 控制台应用程序和计算器进程的信息(从数据库中获取的信息)。当 Calculator Process 完成后,Wrapper 将完成的时间保存到数据库中,我可以在 Dashboard 中显示它已经完成。
问题:
有时 Wrapper 会死掉,计算器进程也会死掉。当它死亡时,它不会将任何信息保存到数据库中,所以我留下了一条未完成状态的记录。
问题:
如何在 Dashbord 中识别哪些未完成的记录是 运行 计算,哪些只是 Wrapper 死后的遗留物?
说明:每个 Wrapper 都是由某个外部代理 started/ended 提供的。每个包装器启动一个计算器进程。 Wrapper 正在等待进程完成,然后更新数据库记录,然后退出。当Wrapper突然挂掉,然后记录没有更新,问题就出现了。
我试过的解决方案:
我试过将计算器进程的 StartTime 保存到数据库中。然后在 Dashboard 中,我尝试按名称检查所有 运行 计算器进程,从 System.Diagnostics.Process class 获取它们的 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()
好的,最后我通过使用不同的访问过程数据的方式修复了它。
using System.Management;
我使用 System.Management 从计算器进程中读取 CreationDate。
public IEnumerable<string> GetTimestampIdOfRunningProcesses(string processName)
{
var managementClass = new ManagementClass("Win32_Process");
foreach (var process in managementClass.GetInstances())
{
var name = process["Name"].ToString();
if (name.StartsWith(processName))
{
var startTimeText = process["CreationDate"].ToString();
var startTime = ManagementDateTimeConverter.ToDateTime(startTimeText);
yield return startTime.ToTimestampId();
}
}
}
其他详细信息:
当我开始这个过程时,我得到了 StartTime。
public DateTime StartProcess(string path)
{
using (var process = new SystemProcess())
{
process.StartInfo = CreateProcessStartInfo(path);
process.Start();
return process.StartTime;
}
}
然后我将它转换为统一格式的字符串(使用扩展方法)。
public static string ToTimestampId(this DateTime dateTime)
{
return dateTime.ToString("yyyy.MM.dd HH:mm:ss.ffffff");
}
这是我统一 System.Management 读取的数据(精度有限)和我在流程开始时获得的非常精确的 StartTime 的方法。这样我就可以比较两个值。
一般问题:如何从同一服务器上的 Web 应用程序 运行 识别进程?假设我们从不同的控制台应用程序启动此过程,但我们可以将有关此过程的任何数据保存到数据库中,该数据库可由 Web 应用程序访问。
我的具体设置,以及更详细的问题描述:
设置:
我有一个控制台应用程序 - 让我们称之为包装器。此应用程序正在启动一个 CPU 繁重的进程,我们称之为计算器进程。 Wrapper 还将有关此过程的信息保存到数据库 - 一条记录。我还有一个网络应用程序 - 仪表板 - 显示有关服务器上所有 运行 控制台应用程序和计算器进程的信息(从数据库中获取的信息)。当 Calculator Process 完成后,Wrapper 将完成的时间保存到数据库中,我可以在 Dashboard 中显示它已经完成。问题:
有时 Wrapper 会死掉,计算器进程也会死掉。当它死亡时,它不会将任何信息保存到数据库中,所以我留下了一条未完成状态的记录。问题:
如何在 Dashbord 中识别哪些未完成的记录是 运行 计算,哪些只是 Wrapper 死后的遗留物?说明:每个 Wrapper 都是由某个外部代理 started/ended 提供的。每个包装器启动一个计算器进程。 Wrapper 正在等待进程完成,然后更新数据库记录,然后退出。当Wrapper突然挂掉,然后记录没有更新,问题就出现了。
我试过的解决方案:
我试过将计算器进程的 StartTime 保存到数据库中。然后在 Dashboard 中,我尝试按名称检查所有 运行 计算器进程,从 System.Diagnostics.Process class 获取它们的 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()
好的,最后我通过使用不同的访问过程数据的方式修复了它。
using System.Management;
我使用 System.Management 从计算器进程中读取 CreationDate。
public IEnumerable<string> GetTimestampIdOfRunningProcesses(string processName)
{
var managementClass = new ManagementClass("Win32_Process");
foreach (var process in managementClass.GetInstances())
{
var name = process["Name"].ToString();
if (name.StartsWith(processName))
{
var startTimeText = process["CreationDate"].ToString();
var startTime = ManagementDateTimeConverter.ToDateTime(startTimeText);
yield return startTime.ToTimestampId();
}
}
}
其他详细信息:
当我开始这个过程时,我得到了 StartTime。
public DateTime StartProcess(string path)
{
using (var process = new SystemProcess())
{
process.StartInfo = CreateProcessStartInfo(path);
process.Start();
return process.StartTime;
}
}
然后我将它转换为统一格式的字符串(使用扩展方法)。
public static string ToTimestampId(this DateTime dateTime)
{
return dateTime.ToString("yyyy.MM.dd HH:mm:ss.ffffff");
}
这是我统一 System.Management 读取的数据(精度有限)和我在流程开始时获得的非常精确的 StartTime 的方法。这样我就可以比较两个值。