监控进程的子进程

Posted

技术标签:

【中文标题】监控进程的子进程【英文标题】:Monitor child processes of a process 【发布时间】:2013-07-29 03:58:25 【问题描述】:

我正在使用此代码运行 .exe 文件:

Process proc = Process.Start("c:\program.exe");
proc.WaitForExit();

如果我在启动进程之前启动 Stopwatch 并在 proc.WaitForExit(); 行之后停止它,我可以获得用户使用该特定程序的时间。

我面临的问题是某些程序(和游戏)使用启动器 - 一些小型 .exe 文件,通常会检查某些内容,然后启动另一个 .exe 文件,该文件实际上是用户想要运行的程序/游戏。在这些情况下,上面的代码不起作用,因为它在启动器存在后返回。

如何跟踪proc 运行的所有进程,并等待它们全部终止?

【问题讨论】:

我的回答对你有帮助吗? @NoIdeaForName: 很遗憾不是 :( 我不知道进程的名称。 +1 表示扩展方法。 @xx77aBs 您应该将您的解决方案作为答案发布,而不是作为问题的一部分。我将其作为社区 wiki 发布,请随时发布您自己的“重复”答案,并在社区 wiki 答案下发表评论,要求将其删除,因为它是您自己的副本。 【参考方案1】:

这是提问者找到的解决方案:

public static class ProcessExtensions

    public static IEnumerable<Process> GetChildProcesses(this Process process)
    
        List<Process> children = new List<Process>();
        ManagementObjectSearcher mos = new ManagementObjectSearcher(String.Format("Select * From Win32_Process Where ParentProcessID=0", process.Id));

        foreach (ManagementObject mo in mos.Get())
        
            children.Add(Process.GetProcessById(Convert.ToInt32(mo["ProcessID"])));
        

        return children;
    

【讨论】:

使用 System.Management;【参考方案2】:

看看这个 - Find all child processes of my own .NET process / find out if a given process is a child of my own? 或 http://social.msdn.microsoft.com/Forums/vstudio/en-US/d60f0793-cc92-48fb-b867-dd113dabcd5c/how-to-find-the-child-processes-associated-with-a-pid。它们提供了通过父 PID(您拥有)查找子进程的方法。

您可以编写监控您创建的进程并获取它的子进程。然后,您可以跟踪所有内容,并等待它们全部完成。我说“尝试”是因为我不确定你能否捕捉到非常快速的变化(一个开始其他人的过程,然后在你得到他的孩子之前死去)。

【讨论】:

谢谢,我检查了您给我的链接,并设法使用 PID 创建了良好的解决方案 :)【参考方案3】:

你不能等待进程(B) 另一个进程(A) 正在运行,如果那个进程(A) 没有等待进程(B)。如果您知道它的名称,您可以使用Process.GetProcessesByName() 跟踪流程

【讨论】:

谢谢,但这对我没有帮助。我不知道要运行的 exe 文件的名称。这就是为什么我需要以某种方式获取 proc 已启动的所有进程。 在这种情况下,您可以在运行程序之前和之后跟踪活动进程......这不是一个好方法,但这是您唯一可以使用的方法 我有想过,但不是很可靠。我会尝试找到一个更好的解决方案,如果找不到,我可能会只跟踪其可执行文件与启动器位于同一文件夹中的进程,或类似的东西。

以上是关于监控进程的子进程的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习-进程管理

golang 热重启

使用supervisor进行进程管理

Shell脚本入门 07:进程与信号

Shell脚本入门 07:进程与信号

Supervisor进程管理