Trova tutti i processi figli del mio processo .NET / scopri se un dato processo è un mio figlio?

Ho una libreria di classi .NET che gira su un processo secondario che viene mantenuto in esecuzione fino a quando non ho eliminato l’object.

A causa di alcune occorrenze del programma che persistono in memoria, ho deciso di aggiungere un test di integrazione per assicurarmi che se lascio che l’object si sovrapponga a GC / Finalization, quel processo viene centrifugato.

Tuttavia, poiché il processo è il client della riga di comando di Mercurial e il mio build server sta già eseguendo Mercurial come parte delle sue operazioni, immagino le situazioni in cui Mercurial è già in esecuzione all’avvio del test, o che è stato avviato, ed è ancora attivo in esecuzione, al termine del test, in relazione al build server e non al mio test.

Quindi, voglio assicurarmi che il client Mercurial che trovo (o meno) sia quello che ho avviato, e non solo qualsiasi client attualmente in esecuzione.

Quindi la domanda è questa:

  • Come posso sapere se il client Mercurial che sto guardando è stato avviato dal mio processo?

Con “guardando”, stavo cercando di utilizzare il metodo Process.GetProcesses , ma questo non è un requisito.

Se una domanda diversa è meglio, “Come trovare tutti i processi figli del mio processo”, es. più facile rispondere, anche quello è più che sufficiente.

Ho trovato questa pagina: come posso conoscere l’ID del processo genitore di un processo? , ma sembra che devo dargli il nome del processo. Se mi limito a dargli “hg”, questa domanda non è ambigua per il caso che sto cercando?

come accade ho un po ‘di codice C # / WMI che gira intorno a uccidere tutti i processi generati da un ID processo specificato, in modo ricorsivo. l’omicidio non è ovviamente quello che vuoi, ma il ritrovamento dei processi figli sembra essere ciò che ti interessa. Spero che questo sia utile:

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

Anche se la risposta di mtijn è probabilmente la più vicina a te, la vera risposta è: non puoi.

Windows non mantiene un albero del processo reale in cui i processi vengono ristrutturati quando muore un processo su un livello intermedio. Tuttavia, Windows ricorda l’ID del processo principale.

Il caso problematico è il seguente:

Struttura di processo originale:

 YourApp.exe - SubApp.exe - Second.exe 

Se ora SubApp.exe termina, l’ID del processo padre di Second.exe non verrà aggiornato. Il nuovo risultato è

 YourApp.exe Second.exe 

È ansible verificare ciò utilizzando SysInternals Process Explorer. È in grado di mostrare i processi come un albero. Avviare CMD, quindi digitare start cmd . Nella nuova finestra, digitare di nuovo start cmd . Avrai 3 windows aperte. Ora termina quello centrale.