

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 与组件生命周期交互
<a name="ipc-component-lifecycle"></a>

使用组件生命周期 IPC 服务可以执行以下操作：
+ 更新核心设备上的组件状态。
+ 订阅组件状态更新。
+ 阻止 Nucleus 在部署期间停止组件以应用更新。
+ 暂停和恢复组件进程。

**Topics**
+ [最低 SDK 版本](#ipc-component-lifecycle-sdk-versions)
+ [Authorization](#ipc-component-lifecycle-authorization)
+ [UpdateState](#ipc-operation-updatestate)
+ [SubscribeToComponentUpdates](#ipc-operation-subscribetocomponentupdates)
+ [DeferComponentUpdate](#ipc-operation-defercomponentupdate)
+ [PauseComponent](#ipc-operation-pausecomponent)
+ [ResumeComponent](#ipc-operation-resumecomponent)

## 最低 SDK 版本
<a name="ipc-component-lifecycle-sdk-versions"></a>

下表列出了在与组件生命周期交互时必须使用的最低版本。 AWS IoT Device SDK 


| SDK | 最低版本 | 
| --- | --- | 
|  [AWS IoT Device SDK 适用于 Java v2](https://github.com/aws/aws-iot-device-sdk-java-v2)  |  v1.2.10  | 
|  [AWS IoT Device SDK 适用于 Python v2](https://github.com/aws/aws-iot-device-sdk-python-v2)  |  v1.5.3  | 
|  [AWS IoT Device SDK 适用于 C\$1\$1 v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2)  |  v1.17.0  | 
|  [AWS IoT Device SDK 适用于 JavaScript v2](https://github.com/aws/aws-iot-device-sdk-js-v2)  |  v1.12.0  | 

## Authorization
<a name="ipc-component-lifecycle-authorization"></a>

要暂停或恢复自定义组件中的其它组件，必须定义允许组件管理其它组件的授权策略。有关定义授权策略的信息，请参阅[授权组件执行 IPC 操作](interprocess-communication.md#ipc-authorization-policies)。

组件生命周期管理的授权策略具有以下属性。

**IPC 服务标识符：**`aws.greengrass.ipc.lifecycle`


| 操作 | 说明 | 资源 | 
| --- | --- | --- | 
|  `aws.greengrass#PauseComponent`  |  允许某个组件暂停您指定的组件。  |  组件名称，或使用 `*` 允许访问所有组件。  | 
|  `aws.greengrass#ResumeComponent`  |  允许某个组件恢复您指定的组件。  |  组件名称，或使用 `*` 允许访问所有组件。  | 
|  `*`  |  允许某个组件暂停和恢复您指定的组件。  |  组件名称，或使用 `*` 允许访问所有组件。  | 

### 授权策略示例
<a name="ipc-component-lifecycle-authorization-policy-examples"></a>

您可以参考以下授权策略示例，帮助您为组件配置授权策略。

**Example 示例授权策略**  
以下示例授权策略允许组件暂停和恢复所有组件。  

```
{
  "accessControl": {
    "aws.greengrass.ipc.lifecycle": {
      "com.example.MyLocalLifecycleComponent:lifecycle:1": {
        "policyDescription": "Allows access to pause/resume all components.",
        "operations": [
          "aws.greengrass#PauseComponent",
          "aws.greengrass#ResumeComponent"
        ],
        "resources": [
          "*"
        ]
      }
    }
  }
}
```

## UpdateState
<a name="ipc-operation-updatestate"></a>

更新核心设备上的组件状态。

### 请求
<a name="ipc-operation-updatestate-request"></a>

此操作的请求包含以下参数：

`state`  
要设置的状态。此枚举 `LifecycleState` 包含以下值：  
+ `RUNNING`
+ `ERRORED`

### 响应
<a name="ipc-operation-updatestate-response"></a>

此操作在其响应中未提供任何信息。

### 示例
<a name="ipc-operation-updatestate-examples"></a>

以下示例演示了如何在自定义组件代码中调用该操作。

------
#### [ Rust ]

**Example 示例：更新状态**  

```
use gg_sdk::{ComponentState, Sdk};

fn main() {
    let sdk = Sdk::init();
    sdk.connect().expect("Failed to establish IPC connection");

    // Update component state to RUNNING
    sdk.update_state(ComponentState::Running)
        .expect("Failed to update component state");

    println!("Successfully updated component state to RUNNING.");
}
```

------
#### [ C ]

**Example 示例：更新状态**  

```
#include <gg/error.h>
#include <gg/ipc/client.h>
#include <gg/sdk.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    gg_sdk_init();

    GgError err = ggipc_connect();
    if (err != GG_ERR_OK) {
        fprintf(stderr, "Failed to establish IPC connection.\n");
        exit(-1);
    }

    // Update component state to RUNNING
    err = ggipc_update_state(GG_COMPONENT_STATE_RUNNING);
    if (err != GG_ERR_OK) {
        fprintf(stderr, "Failed to update component state.\n");
        exit(-1);
    }

    printf("Successfully updated component state to RUNNING.\n");
}
```

------
#### [ C\$1\$1 (Component SDK) ]

**Example 示例：更新状态**  

```
#include <gg/ipc/client.hpp>
#include <iostream>

int main() {
    auto &client = gg::ipc::Client::get();

    auto error = client.connect();
    if (error) {
        std::cerr << "Failed to establish IPC connection.\n";
        exit(-1);
    }

    // Update component state to RUNNING
    error = client.update_component_state(GG_COMPONENT_STATE_RUNNING);
    if (error) {
        std::cerr << "Failed to update component state.\n";
        exit(-1);
    }

    std::cout << "Successfully updated component state to RUNNING.\n";
}
```

------

## SubscribeToComponentUpdates
<a name="ipc-operation-subscribetocomponentupdates"></a>

订阅即可在 AWS IoT Greengrass 核心软件更新组件之前接收通知。该通知指定了在更新过程中 Nucleus 是否会重启。

只有当部署的组件更新策略指定通知组件时，Nucleus 才会发送更新通知。默认行为是通知组件。有关更多信息，请参阅[创建部署](create-deployments.md)以及您在调用[CreateDeployment](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_CreateDeployment.html)操作时可以提供的[DeploymentComponentUpdatePolicy](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_DeploymentComponentUpdatePolicy.html)对象。

**重要**  
本地部署不会在更新之前通知组件。

<a name="ipc-subscribe-operation-note"></a>此操作是一种订阅操作，您可以在其中订阅事件消息流。要使用此操作，请定义一个流响应处理程序，其中包含处理事件消息、错误和流关闭的函数。有关更多信息，请参阅 [订阅 IPC 事件流](interprocess-communication.md#ipc-subscribe-operations)。

**事件消息类型：**`ComponentUpdatePolicyEvents`

**提示**  
您可以按照教程了解如何开发一个有条件地推迟组件更新的组件。有关更多信息，请参阅 [教程：开发可延迟组件更新的 Greengrass 组件](defer-component-updates-tutorial.md)。

### 请求
<a name="ipc-operation-subscribetocomponentupdates-request"></a>

此操作的请求没有任何参数。

### 响应
<a name="ipc-operation-subscribetocomponentupdates-response"></a>

此操作的响应包含以下信息：

`messages`  
通知消息流。此对象 `ComponentUpdatePolicyEvents` 包含以下信息：    
`preUpdateEvent`（Python：`pre_update_event`）  
（可选）指示 Nucleus 想要更新组件的事件。您可以通过 [DeferComponentUpdate](#ipc-operation-defercomponentupdate) 操作进行响应，以确认更新或推迟更新，直到组件准备好重启为止。此对象 `PreComponentUpdateEvent` 包含以下信息：    
`deploymentId`（Python：`deployment_id`）  
更新组件的 AWS IoT Greengrass 部署的 ID。  
`isGgcRestarting`（Python：`is_ggc_restarting`）  
Nucleus 是否需要重启才能应用更新。  
`postUpdateEvent`（Python：`post_update_event`）  
（可选）指示 Nucleus 已更新组件的事件。此对象 `PostComponentUpdateEvent` 包含以下信息：    
`deploymentId`（Python：`deployment_id`）  
更新组件的 AWS IoT Greengrass 部署的 ID。  
此功能需要 v2.7.0 或更高版本的 Greengrass Nucleus 组件。

## DeferComponentUpdate
<a name="ipc-operation-defercomponentupdate"></a>

确认或推迟使用 [SubscribeToComponentUpdates](#ipc-operation-subscribetocomponentupdates) 发现的组件更新。您可以指定在 Nucleus 再次检查组件是否准备好让组件更新继续之前等待的时长。您也可以使用此操作告知 Nucleus 您的组件已准备好进行更新。

如果某个组件未响应组件更新通知，则 Nucleus 会按您在部署组件更新策略中指定的时间等待。超时之后，Nucleus 继续部署。组件更新超时默认值为 60 秒。有关更多信息，请参阅[创建部署](create-deployments.md)以及您在调用[CreateDeployment](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_CreateDeployment.html)操作时可以提供的[DeploymentComponentUpdatePolicy](https://docs.aws.amazon.com/greengrass/v2/APIReference/API_DeploymentComponentUpdatePolicy.html)对象。

**提示**  
您可以按照教程了解如何开发一个有条件地推迟组件更新的组件。有关更多信息，请参阅 [教程：开发可延迟组件更新的 Greengrass 组件](defer-component-updates-tutorial.md)。

### 请求
<a name="ipc-operation-defercomponentupdate-request"></a>

此操作的请求包含以下参数：

`deploymentId`（Python：`deployment_id`）  
要推迟的 AWS IoT Greengrass 部署的 ID。

`message`  
（可选）要推迟更新的组件的名称。  
默认为发出请求的组件名称。

`recheckAfterMs`（Python：`recheck_after_ms`）  
推迟更新的时长（以毫秒为单位）。Nucleus 会等待这段时间，然后发送另一个可以通过 [SubscribeToComponentUpdates](#ipc-operation-subscribetocomponentupdates) 发现的 `PreComponentUpdateEvent`。  
指定 `0` 即可确认更新。这会告知 Nucleus 您的组件已准备好进行更新。  
默认为零毫秒，这意味着确认更新。

### 响应
<a name="ipc-operation-defercomponentupdate-response"></a>

此操作在其响应中未提供任何信息。

## PauseComponent
<a name="ipc-operation-pausecomponent"></a>

[此功能适用于 Greengrass nucleus 组件的 v2.4.0 及更高版本。](greengrass-nucleus-component.md) AWS IoT Greengrass 目前不支持在 Windows 核心设备上使用此功能。

暂停核心设备上的组件进程。要恢复组件，请使用[ResumeComponent](#ipc-operation-resumecomponent)操作。

只能暂停通用组件。如果您尝试暂停任何其它类型的组件，则此操作将引发 `InvalidRequestError`。

**注意**  
此操作无法暂停容器化进程，例如 Docker 容器。要暂停和恢复 Docker 容器，可以使用 [docker pause](https://docs.docker.com/engine/reference/commandline/pause/) 命令和 [docker unpause](https://docs.docker.com/engine/reference/commandline/unpause/) 命令。

此操作不会暂停组件依赖关系或依赖于您暂停的组件的组件。当暂停依赖于另一个组件的组件时，请考虑这种行为，因为依赖组件在暂停依赖关系时可能会遇到问题。

当您重启或关闭已暂停的组件时（例如通过部署），Greengrass nucleus 会恢复该组件并运行其关闭生命周期。有关重启组件的更多信息，请参阅 [RestartComponent](ipc-local-deployments-components.md#ipc-operation-restartcomponent)。

**重要**  
要使用此操作，您必须定义授权策略来授予使用此操作的权限。有关更多信息，请参阅 [Authorization](#ipc-component-lifecycle-authorization)。

### 最低 SDK 版本
<a name="ipc-operation-pausecomponent-sdk-versions"></a>

下表列出了暂停和恢复组件时 AWS IoT Device SDK 必须使用的最低版本。


| SDK | 最低版本 | 
| --- | --- | 
|  [AWS IoT Device SDK 适用于 Java v2](https://github.com/aws/aws-iot-device-sdk-java-v2)  |  v1.4.3  | 
|  [AWS IoT Device SDK 适用于 Python v2](https://github.com/aws/aws-iot-device-sdk-python-v2)  |  v1.6.2  | 
|  [AWS IoT Device SDK 适用于 C\$1\$1 v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2)  |  v1.13.1  | 
|  [AWS IoT Device SDK 适用于 JavaScript v2](https://github.com/aws/aws-iot-device-sdk-js-v2)  |  v1.12.0  | 

### 请求
<a name="ipc-operation-defercomponentupdate-request"></a>

此操作的请求包含以下参数：

`componentName`（Python：`component_name`）  
要暂停的组件的名称，该组件必须是通用组件。有关更多信息，请参阅 [组件类型](develop-greengrass-components.md#component-types)。

### 响应
<a name="ipc-operation-defercomponentupdate-response"></a>

此操作在其响应中未提供任何信息。

## ResumeComponent
<a name="ipc-operation-resumecomponent"></a>

[此功能适用于 Greengrass nucleus 组件的 v2.4.0 及更高版本。](greengrass-nucleus-component.md) AWS IoT Greengrass 目前不支持在 Windows 核心设备上使用此功能。

恢复核心设备上的组件进程。要暂停组件，请使用[PauseComponent](#ipc-operation-pausecomponent)操作。

您只能恢复已暂停的组件。如果您尝试恢复未暂停的组件，则此操作将引发 `InvalidRequestError`。

**重要**  
要使用此操作，您必须定义授权策略来授予执行此操作的权限。有关更多信息，请参阅 [Authorization](#ipc-component-lifecycle-authorization)。

### 最低 SDK 版本
<a name="ipc-operation-resumecomponent-sdk-versions"></a>

下表列出了暂停和恢复组件时 AWS IoT Device SDK 必须使用的最低版本。


| SDK | 最低版本 | 
| --- | --- | 
|  [AWS IoT Device SDK 适用于 Java v2](https://github.com/aws/aws-iot-device-sdk-java-v2)  |  v1.4.3  | 
|  [AWS IoT Device SDK 适用于 Python v2](https://github.com/aws/aws-iot-device-sdk-python-v2)  |  v1.6.2  | 
|  [AWS IoT Device SDK 适用于 C\$1\$1 v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2)  |  v1.13.1  | 
|  [AWS IoT Device SDK 适用于 JavaScript v2](https://github.com/aws/aws-iot-device-sdk-js-v2)  |  v1.12.0  | 

### 请求
<a name="ipc-operation-defercomponentupdate-request"></a>

此操作的请求包含以下参数：

`componentName`（Python：`component_name`）  
要恢复的组件的名称。

### 响应
<a name="ipc-operation-defercomponentupdate-response"></a>

此操作在其响应中未提供任何信息。