2011-08-25 28 views
6

Tengo una biblioteca de clases .NET que activa un proceso secundario que se ejecuta hasta que elimino el objeto.Buscar todos los procesos secundarios de mi propio proceso .NET/averiguar si un proceso determinado es hijo propio.

Debido a algunas ocurrencias del programa persistente en la memoria, he decidido agregar una prueba de integración para asegurar que si dejo que el objeto caduque en GC/Finalización, ese proceso se desactiva.

Sin embargo, dado que el proceso es el cliente de línea de comandos de Mercurial, y mi servidor de compilación ya está ejecutando Mercurial como parte de sus propias operaciones, imagino situaciones en las que Mercurial ya se está ejecutando cuando se inicia esa prueba o cuando se inicia , y aún se está ejecutando, cuando finaliza la prueba, en relación con el servidor de compilación, y no con mi prueba.

Por lo tanto, quiero asegurarme de que el cliente de Mercurial que encuentro (o no) es el que inicié, y no solo cualquier cliente que se está ejecutando actualmente.

Así que la pregunta es la siguiente:

  • ¿Cómo puedo saber si el cliente Mercurial estoy mirando fue iniciado por mi proceso?

Al "mirar", estaba usando el método Process.GetProcesses, pero esto no es un requisito.

Si una pregunta diferente es mejor, "Cómo encontrar todos procesos secundarios de mi propio proceso", es decir. más fácil de responder, ese es más que suficiente también.

Encontré esta página: How I can know the parent process ID of a process?, pero parece que tengo que darle el nombre del proceso. Si solo le doy "hg", ¿no es esa pregunta demasiado ambigua para el caso que estoy buscando?

Respuesta

16

como ocurre Tengo un poco de código C#/WMI por ahí que mata todos los procesos generados por una identificación de proceso especificada, de forma recursiva. la muerte no es, obviamente, lo que quiere, pero el hallazgo de procesos hijo parece ser lo que le interesa espero que esto sea útil:.

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(); 
       } 
      } 
     } 
    } 
+1

Esto funcionó muy bien para mí, aunque opté por un enfoque más simple usando ManagementObject y ningún buscador. He estado luchando con matar a mis subprocesos durante un tiempo, ¡gracias! – Darkhydro

+0

Salvavidas !!!!!! – mstrewe

0

Altough la answer of mtijn es probablemente el más cercano que puede ger, la la respuesta real es: no puedes.

Windows no mantiene un árbol de procesos real donde los procesos se reestructuran cuando un proceso en un nivel intermedio muere. Sin embargo, Windows recuerda el ID del proceso principal.

El caso problemático es el siguiente:

estructura de procesos original:

YourApp.exe 
- SubApp.exe 
    - Second.exe 

Si ahora termina SubApp.exe, no se actualizará el ID del proceso padre del Second.exe. El nuevo resultado es

YourApp.exe 
Second.exe 

Puede verificar esto utilizando SysInternals Process Explorer. Puede mostrar los procesos como un árbol. Inicie CMD, luego escriba start cmd. En la nueva ventana, escriba start cmd nuevamente. Tendrás 3 ventanas abiertas Ahora termina el medio.

Cuestiones relacionadas