.net - 查找我自己的 .NET 进程的所有子进程/查明给定进程是否是我自己的子进程?

标签 .net process child-process

我有一个 .NET 类库,它启动一个辅助进程,该进程一直运行,直到我处理该对象。

由于程序在内存中徘徊,我决定添加一个集成测试,以确保如果我让对象进入 GC/Finalization,该进程就会停止运行。

但是,由于该进程是 Mercurial 命令行客户端,并且我的构建服务器已经在运行 Mercurial 作为其自身操作的一部分,因此我设想 Mercurial 在测试开始时已经在运行或者已启动的情况,当测试完成时,并且仍在运行,与构建服务器相关,而不是我的测试。

因此,我想确保我找到(或不是)的 Mercurial 客户端是我启动的客户端,而不仅仅是当前正在运行的任何客户端。

所以问题是这样的:

  • 如何查明我正在查看的 Mercurial 客户端是否是由我的进程启动的?

通过“查看”,我正在查看使用 Process.GetProcesses方法,但这不是必需的。

如果一个不同的问题更好,“如何找到我自己进程的所有子进程”,即。更容易回答,这也绰绰有余。

我找到了这个页面:How I can know the parent process ID of a process? ,但似乎我必须给它进程名称。如果我只是给它“hg”,对于我正在寻找的情况来说,这个问题是否太模糊了?

最佳答案

碰巧我有一些 C#/WMI 代码,它会递归地杀死由指定进程 ID 生成的所有进程。杀死显然不是你想要的,但找到子进程似乎是你感兴趣的。我希望这有帮助:

    private static void KillAllProcessesSpawnedBy(UInt32 parentProcessId)
    {
        logger.Debug("Finding processes spawned by process with Id [" + parentProcessId + "]");

        // NOTE: Process Ids are reused!
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(
            "SELECT * " +
            "FROM Win32_Process " +
            "WHERE ParentProcessId=" + parentProcessId);
        ManagementObjectCollection collection = searcher.Get();
        if (collection.Count > 0)
        {
            logger.Debug("Killing [" + collection.Count + "] processes spawned by process with Id [" + parentProcessId + "]");
            foreach (var item in collection)
            {
                UInt32 childProcessId = (UInt32)item["ProcessId"];
                if ((int)childProcessId != Process.GetCurrentProcess().Id)
                {
                    KillAllProcessesSpawnedBy(childProcessId);

                    Process childProcess = Process.GetProcessById((int)childProcessId);
                    logger.Debug("Killing child process [" + childProcess.ProcessName + "] with Id [" + childProcessId + "]");
                    childProcess.Kill();
                }
            }
        }
    }

关于.net - 查找我自己的 .NET 进程的所有子进程/查明给定进程是否是我自己的子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7189117/

相关文章:

javascript - 从 Nodejs 获取子进程的进度输出

java - 通过 CreateProcess() 启动的 JVM 丢失类路径库

c - 多进程失败 - 查找最后使用的函数

c# - 在 C# NET 中运行 Java 应用程序

.net - 选择要在 Visual Studio 应用程序中使用的 .NET Framework

c# - 在 Visual Studio 中启用 SSL - 未提示安装证书

c# - 为什么 Color 使用 Int32 而不是 Byte?

c# - 为什么 Process.Exited 事件会触发两次?

python - 使用 Process.Terminate() 时如何解决队列损坏

visual-studio - 可以使用 Visual Studio 来调试 WinDBG 之类的子进程吗?