2012-04-25 18 views
5

MSDN page on Job Objects giải thích:Làm cách nào để kiểm soát đáng tin cậy tuổi thọ của quy trình phụ mà không cần phải có đối tượng công việc lồng nhau?

Quy trình chỉ có thể được kết hợp với một công việc. Không thể lồng nhau công việc. Khả năng làm tổ được thêm vào trong Windows 8 Consumer Preview và Windows Server 8 Beta.

Thật không may, có vẻ như đây chỉ là những gì tôi cần. Tôi đang làm việc với một cây quá trình như thế này:

server.exe 
    | 
    +--+ utility.exe 
    | 
    +--+ launcherA.exe 
    |  | 
    |  +--+ programA.exe 
    |    | 
    |    +--+ subProcessA.exe 
    | 
    +--+ launcherB.exe 
     | 
     +--+ programB.exe 

tôi cố gắng thực hiện các hành vi sau đây:

  1. Nếu server.exe được chấm dứt bằng cách nào đó (vì nó bị treo, hoặc do người dùng quyết định chấm dứt bằng cách sử dụng trình quản lý tác vụ hoặc đơn giản vì nó hoàn thành việc thực hiện), nó sẽ gỡ tất cả các tiến trình bên dưới nó. Tôi sử dụng một đối tượng công việc cho việc này.

  2. Nếu launcherA.exe hoặc launchedB.exe chấm dứt vì một lý do nào đó, chúng gỡ xuống tất cả các quy trình bên dưới chúng. Thật không may tôi không thể sử dụng các đối tượng công việc ở đây vì các đối tượng công việc không làm tổ.

Vì vậy, tôi thường quản lý để tạo các quy trình 'lơ lửng' bằng cách giết các quy trình tùy ý trong cây trên. Tôi cố gắng tránh để lại bất kỳ quy trình cũ nào, nhưng tất cả các giải pháp tôi đã đưa ra cho đến nay dựa vào một số loại quy trình giám sát để theo dõi các quá trình khác - nhưng nếu cơ quan giám sát bị giết, tất cả hy vọng đều bị mất.

+1

Giữ công việc cấp cao nhất trên server.exe và đặt server.exe làm cơ quan giám sát. Bằng cách đó, nếu cơ quan giám sát bị chết, đối tượng công việc sẽ gỡ bỏ tất cả các quy trình con. –

+0

@RaymondChen: Nghe hay đấy. Nếu tôi tạo đồng hồ 'server.exe'' launcherA.exe' và 'launchB.exe', tôi sẽ thông báo khi chúng bị chấm dứt vì một lý do nào đó. Tuy nhiên - làm thế nào tôi có thể tìm ra các tiến trình con tại thời điểm đó? Tôi đang sử dụng 'WaitForSingleObject' để nhận được thông báo về quá trình kết thúc, nhưng tại thời điểm đó tôi không thể nói những gì các tiến trình con là vì chúng đã được reparented. Tôi đã xem xét 'CreateToolhelp32Snapshot' để theo dõi các tiến trình con, hoặc có thể là WMI. Có thể có giải pháp dễ dàng hơn không? –

+0

Bạn nói rằng bạn đã có một giải pháp với quy trình giám sát.Chỉ cần sử dụng lại giải pháp đó (bao gồm cả phần theo dõi các quy trình con), nhưng làm cho server.exe trở thành cơ quan giám sát. –

Trả lời

0

Tôi nghĩ có đang hiểu nhầm các tính năng mới Nested Jobs mà sẽ được hỗ trợ trong Windows 8.

Nếu bạn sử dụng quá trình bắt đầu server.exe mà bắt đầu quá trình launcherA.exe mà bắt đầu quá trình subProcessA.exe và vân vân bạn chỉ cần bắt đầu server.exe trong là những gì một công việc. Trong cách tất cả trẻ em khác (launcherA.exe, subProcessA.exe và cứ tiếp tục) sẽ tự động được bắt đầu bên trong cùng một công việc với cha mẹ của bạn. Vì vậy, bạn có thể theo dõi tất cả các bộ sưu tập của các quá trình cùng một lúc. Bạn thậm chí có thể nhận được thông báo về mọi sự bắt đầu của quy trình mới để tạo tệp nhật ký chi tiết chẳng hạn. Tôi đã làm điều này trên một số ứng dụng và nó hoạt động rất tốt.

Vấn đề duy nhất bạn có thể nhận được là nếu một số từ exe con cũng "đủ hiện đại" và sử dụng Công việc để kiểm soát con mình trẻ em. Chỉ trong trường hợp bạn sẽ phải sử dụng công việc Nested mới.

Nếu tôi hiểu đúng câu hỏi của bạn, vấn đề hiện tại của bạn có thể được giải quyết đơn giản bằng cách đặt server.exe chỉ trong một công việc mới.

+1

Vấn đề thực sự là những gì bạn mô tả trong đoạn thứ ba của bạn - 'launcherA.exe' hoặc' launcherB.exe' thực sự hỗ trợ quản lý một đối tượng công việc một mình. –

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