共用方式為


作業物件

作業物件 允許將進程群組當作一個單位來管理。 作業物件是可交集、安全性實體、可共用的物件,可控制與其相關聯的進程屬性。 作業物件上執行的作業會影響與作業對象相關聯的所有進程。 範例包括強制執行限制,例如工作集大小和進程優先順序,或終止與作業相關聯的所有進程。

建立作業

若要建立作業物件,請使用 CreateJobObject 函式。 建立作業時,沒有任何進程與作業相關聯。

若要將進程與作業產生關聯,請使用 AssignProcessToJobObject 函式。 當進程與作業相關聯之後,就無法中斷關聯。 進程可以與巢狀作業階層中的多個作業相關聯。 如需詳細資訊,請參閱 巢狀作業

Windows 7、Windows Server 2008 R2、Windows XP with SP3、Windows Server 2008、Windows Vista 和 Windows Server 2003: 進程只能與一個作業相關聯。 作業無法巢狀化。 Windows 8 和 Windows Server 2012 已新增巢狀作業的能力。

當您呼叫 createJobObject函式時,您可以為作業物件指定安全性描述元。 如需詳細資訊,請參閱 Job Object Security and Access Rights

管理作業中的程式

進程與作業建立關聯之後,根據預設,它會 使用 createProcess 建立的任何子進程,也會與作業相關聯。 (使用 Win32_Process 建立的子進程。建立 與作業無關。您可以藉由為作業設定擴充限制JOB_OBJECT_LIMIT_BREAKAWAY_OK或JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK,來變更此預設行為。

  • 如果作業具有擴充限制JOB_OBJECT_LIMIT_BREAKAWAY_OK,且父進程是以 CREATE_BREAKAWAY_FROM_JOB 旗標建立,則父進程的子進程不會與作業相關聯。
  • 如果作業具有擴充限制JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK,則與作業相關聯的任何父進程子進程都不會與作業相關聯。 不需要使用 CREATE_BREAKAWAY_FROM_JOB 旗標建立父進程。

如果作業是巢狀的,階層中父作業的中斷設定會影響子進程是否與階層中的另一個作業相關聯。 如需詳細資訊,請參閱 巢狀作業

若要判斷進程是否在作業中執行,請使用 IsProcessInJob 函式。

若要終止目前與作業對象相關聯的所有進程,請使用 TerminateJobObject 函式。

作業限制和通知

作業可以針對與作業相關聯的每個進程強制執行工作集大小、進程優先順序和工作結束時間限制等限制。 如果與作業相關聯的進程嘗試從作業所建立的限制增加其工作集大小或進程優先順序,則函式會呼叫成功,但會以無訊息方式忽略。 作業也可以設定限制,在超過通知時觸發通知,但允許作業繼續執行。

若要設定作業的限制,請使用 SetInformationJobObject 函式。 如需可針對作業設定的可能限制清單,請參閱下列主題:

安全性限制必須針對與作業對象相關聯的每個進程個別設定。 如需詳細資訊,請參閱 處理安全性和存取權限

Windows XP 與 SP3 和 Windows Server 2003:SetInformationJobObject 函式可用來設定與作業對象相關聯之所有進程的安全性限制。 從 Windows Vista 開始,必須針對與作業對象相關聯的每個進程個別設定安全性限制。

如果作業是巢狀的,階層中的父作業會影響為作業強制執行的限制。 如需詳細資訊,請參閱 巢狀作業

如果作業有相關聯的 I/O 完成埠,當超過特定作業限制時,它可以接收通知。 當超過限制或發生特定其他事件時,系統會將訊息傳送至完成埠。 若要將完成埠與作業產生關聯,請使用 SetInformationJobObject 函式搭配 job 對象資訊類別 JobObjectAssociateCompletionPortInformationJOBOBJECT_ASSOCIATE_COMPLETION_PORT 結構的指標。 當作業處於非使用中狀態時,最好這樣做,以減少在完成埠關聯期間狀態變更的進程遺漏通知的機會。

所有訊息都會直接從作業傳送,就像作業已呼叫 PostQueuedCompletionStatus 函式一樣。 線程必須使用 getQueuedCompletionStatus GetQueuedCompletionStatus 函式來監視完成埠,才能挑選訊息。 請注意,除了 JobObjectNotificationLimitInformation 資訊類別所設定的限制之外,不保證會將訊息傳遞至完成埠:訊息送達失敗不一定表示未發生事件。 JobObjectNotificationLimitInformation 所設定之限制的通知保證會到達完成埠。 如需可能的訊息清單,請參閱 JOBOBJECT_ASSOCIATE_COMPLETION_PORT

作業的資源會計

作業物件會記錄其所有相關聯處理程式的基本會計資訊,包括已終止的程式。 若要擷取此會計資訊,請使用 QueryInformationJobObject 函式。 如需作業所維護的會計資訊清單,請參閱下列主題:

如果作業對像是巢狀的,則會在其父作業中匯總每個子作業的會計資訊。 如需詳細資訊,請參閱 巢狀作業

管理作業物件

作業物件的狀態會設定為在終止所有進程時發出訊號,因為已超過指定的作業結束時間限制。 使用 WaitForSingleObjectWaitForSingleObjectEx 監視此事件的工作物件。

若要取得現有作業物件的句柄,請使用 OpenJobObject 函式,並在建立物件時指定對象的名稱。 只能開啟具名作業物件。

若要關閉作業物件句柄,請使用 CloseHandle 函式。 作業在最後一個句柄已關閉且所有相關聯的進程已終止時終結。 不過,如果作業已指定JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE旗標,則關閉最後一個作業物件句柄會終止所有相關聯的進程,然後終結作業物件本身。 如果巢狀作業已指定JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE旗標,則關閉最後一個作業物件句柄會終止與作業及其階層中子作業相關聯的所有進程。

管理使用作業對象的進程樹狀結構

從 Windows 8 和 Windows Server 2012 開始,應用程式可以使用 巢狀作業 來管理使用多個作業對象的進程樹狀結構。 不過,必須在 Windows 7、Windows Server 2008 R2 或不支援巢狀作業的舊版 Windows 上執行的應用程式必須以其他方式管理進程樹狀結構。

如果工具必須管理使用作業對象的進程樹狀結構,而且無法使用巢狀作業,則工具與進程樹狀結構的成員都必須合作。 使用下列其中一個選項:

  • 使用JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK限制。 如果此工具使用此限制,就無法監視整個進程樹狀結構。 此工具只能監視它新增至作業的進程。 如果這些進程建立子進程,它們就不會與作業相關聯。 在此選項中,子進程可以與其他作業對象相關聯。

  • 使用JOB_OBJECT_LIMIT_BREAKAWAY_OK限制。 如果此工具使用此限制,它可以監視整個進程樹狀結構,但樹狀結構中任何成員明確脫離樹狀結構的進程除外。 樹狀結構的成員可以在新的作業物件中建立子進程,方法是使用 CREATE_BREAKAWAY_FROM_JOB 旗標呼叫 CreateProcess 函式,然後呼叫 AssignProcessToJobObject 函式。 否則,成員必須處理 AssignProcessToJobObject 失敗的情況。

    如果工具未監視樹狀結構,則CREATE_BREAKAWAY_FROM_JOB旗標沒有任何作用。 因此,這是慣用的選項,但需要事先瞭解要監視的進程。

  • 藉由設定JOB_OBJECT_LIMIT_BREAKAWAY_OK和JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK限制,防止任何種類的中斷。 在此選項中,此工具可以監視整個進程樹狀結構。 不過,如果子進程嘗試藉由呼叫 AssignProcessToJobObject,將本身或其他子進程與作業產生關聯,呼叫將會失敗。 如果此程式是設計成與特定作業相關聯,此失敗可能會使進程無法正常運作。