2011-08-25 21 views
6

Tôi có một thư viện lớp .NET xoay vòng một tiến trình phụ được tiếp tục chạy cho đến khi tôi vứt bỏ đối tượng.Tìm tất cả quy trình con của quy trình .NET của riêng tôi/tìm hiểu xem liệu một quy trình cụ thể có phải là con của riêng tôi không?

Do một số lần xuất hiện của chương trình kéo dài trong bộ nhớ, tôi đã quyết định thêm kiểm tra tích hợp để đảm bảo rằng nếu tôi để đối tượng mất hiệu lực GC/Hoàn tất, quá trình đó sẽ được gỡ xuống. Tuy nhiên, vì quá trình này là máy khách dòng lệnh Mercurial, và máy chủ xây dựng của tôi đã chạy Mercurial như là một phần của các hoạt động riêng của nó, tôi hình dung các tình huống mà Mercurial đang chạy khi thử nghiệm bắt đầu hoặc nó được bắt đầu. Quay lại đầu trang và vẫn chạy, khi kiểm tra kết thúc, liên quan đến máy chủ xây dựng chứ không phải thử nghiệm của tôi.

Vì vậy, tôi muốn đảm bảo khách hàng Mercurial tôi tìm thấy (hoặc không) là khách hàng tôi đã bắt đầu và không chỉ bất kỳ khách hàng nào hiện đang chạy.

Vậy câu hỏi là thế này:

  • Làm thế nào tôi có thể tìm hiểu xem khách hàng Mercurial Tôi đang tìm kiếm tại được bắt đầu bởi tiến trình của tôi?

Bằng cách "xem", tôi đã xem xét sử dụng phương pháp Process.GetProcesses, nhưng đây không phải là yêu cầu.

Nếu một câu hỏi khác là tốt hơn, "Cách tìm kiếm tất cả quy trình con của quy trình của riêng tôi", nghĩa là. dễ dàng hơn để trả lời, đó là một là quá đủ là tốt.

Tôi tìm thấy trang này: How I can know the parent process ID of a process?, nhưng có vẻ như tôi phải đặt tên quy trình. Nếu tôi chỉ cung cấp cho nó "hg", câu hỏi đó không quá mơ hồ đối với trường hợp tôi đang tìm kiếm?

Trả lời

16

vì nó xảy ra Tôi có một chút mã C#/WMI nằm xung quanh mà giết chết tất cả các quá trình sinh ra bởi một id quy trình được chỉ định, đệ quy. giết chết rõ ràng là không phải những gì bạn muốn, nhưng phát hiện của tiến trình con có vẻ là những gì bạn đang quan tâm đến việc tôi hy vọng điều này là hữu ích:.

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

Điều này có hiệu quả đối với tôi, mặc dù tôi đã đi theo một cách tiếp cận đơn giản hơn bằng cách sử dụng ManagementObject và không có người tìm kiếm nào. Tôi đã đấu tranh với việc giết chết các quy trình con của tôi một thời gian, cảm ơn! – Darkhydro

+0

Trình tiết kiệm cuộc sống !!!!!! – mstrewe

0

Mặc dù các answer of mtijn có lẽ là gần nhất bạn có thể ger, các câu trả lời thực sự là: bạn không thể.

Windows không duy trì một cây quá trình thực sự trong đó các quy trình được cấu trúc lại khi quá trình trên cấp trung gian bị chết. Tuy nhiên, Windows không nhớ ID tiến trình cha.

Trường hợp có vấn đề như sau:

gốc cấu trúc quá trình:

YourApp.exe 
- SubApp.exe 
    - Second.exe 

Nếu bây giờ SubApp.exe chấm dứt, quá trình cha mẹ ID của Second.exe sẽ không được cập nhật. Kết quả mới là

YourApp.exe 
Second.exe 

Bạn có thể xác minh điều này bằng SysInternals Process Explorer. Nó có thể hiển thị các quá trình như một cái cây. Bắt đầu CMD, sau đó nhập start cmd. Vào cửa sổ mới, nhập lại start cmd. Bạn sẽ có 3 cửa sổ đang mở. Bây giờ chấm dứt giữa.

Các vấn đề liên quan