

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

# 使用队列环境配置作业
<a name="configure-jobs"></a>

AWS Deadline Cloud 使用*队列环境*在工作人员上配置软件。环境使您能够对会话中的所有任务执行一次耗时的任务，例如设置和拆卸。它定义了启动或停止会话时要在工作器上运行的操作。您可以为队列、队列中运行的作业以及作业的各个步骤配置环境。

您可以将环境定义为队列环境或作业环境。使用 Deadline Cloud 控制台或[截止日期：CreateQueueEnvironment](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateQueueEnvironment.html)操作创建队列环境，并在您提交的作业的作业模板中定义作业环境。它们遵循环境的 Open Job Description (OpenJD) 规范。有关详细信息，请参阅<Environment>上[https://github.com/OpenJobDescription/openjd-specifications/wiki/2023-09-Template-Schemas#4-environment](https://github.com/OpenJobDescription/openjd-specifications/wiki/2023-09-Template-Schemas#4-environment)的 OpenJD 规范。 GitHub

除了`name`和之外`description`，每个环境还包含两个用于定义主机环境的字段。它们是：
+ `script`— 在工作器上运行此环境时采取的操作。
+ `variables`— 进入环境时设置的一组环境变量 name/value 对。

必须至少设置`script`或中的一个`variables`。

您可以在作业模板中定义多个环境。每个环境都是按照它们在模板中列出的顺序应用的。您可以使用它来帮助管理环境的复杂性。

Deadline Cloud 的默认队列环境使用 conda 包管理器将软件加载到环境中，但你可以使用其他包管理器。默认环境定义了两个参数来指定应加载的软件。这些变量由 Deadline Cloud 提供的提交者设置，但您可以在自己的脚本和使用默认环境的应用程序中进行设置。它们是：
+ `CondaPackages`— 以空格分隔的 conda 软件包列表与要为该任务安装的规格相匹配。例如，Blender 提交者将在 Blender 3.6 中添加`blender=3.6`渲染帧。
+ `CondaChannels`— 以空格分隔的 conda 频道列表，用于安装软件包。对于服务管理的舰队，软件包是通过渠道安装的。`deadline-cloud`您可以添加其他频道。

# 使用 OpenJD 队列环境控制作业环境
<a name="control-the-job-environment"></a>

您可以使用*队列环境为渲染作业定义自定义环境*。队列环境是一种模板，用于控制在特定队列中运行的作业的环境变量、文件映射和其他设置。它使您能够根据工作负载的要求为提交到队列的作业定制执行环境。 AWS Deadline Cloud 提供了三个嵌套级别，您可以在其中应用[开放式职位描述 (OpenJD) 环境](https://github.com/OpenJobDescription/openjd-specifications/wiki/2023-09-Template-Schemas#4-environment)：队列、作业和步骤。通过定义队列环境，您可以确保不同类型的作业具有一致且经过优化的性能，简化资源分配并简化队列管理。

队列环境是一个模板，您可以通过 AWS 管理控制台或使用将其附加到 AWS 账户中的队列 AWS CLI。您可以为队列创建一个环境，也可以创建用于创建执行环境的多个队列环境。这种方法使您能够分步创建和测试环境，以帮助确保它能正常运行于您的作业。

作业和步骤环境是在您用来在队列中创建作业的作业模板中定义的。在这些不同形式的环境中，OpenJD 语法是相同的。在本节中，我们将在作业模板中展示它们。

**Topics**
+ [在队列环境中设置环境变量](set-environment-variables.md)
+ [在队列环境中设置路径](set-the-path.md)
+ [在队列环境中运行后台守护进程](run-a-background-daemon-process.md)

# 在队列环境中设置环境变量
<a name="set-environment-variables"></a>

许多应用程序和框架使用环境变量来控制功能设置、日志级别和显示配置。你可以使用 Ope [n Job Description (OpenJD) 环境](https://github.com/OpenJobDescription/openjd-specifications/wiki/2023-09-Template-Schemas#4-environment)来设置其范围内的每个任务命令都继承的环境变量。

## 环境变量作用域
<a name="set-env-vars-scope"></a>

AWS Deadline Cloud 会应用您附加到队列的队列环境中的环境变量。在作业模板中，您还可以使用 [OpenJD 环境在作业和步骤级别定义环境](https://github.com/OpenJobDescription/openjd-specifications/wiki/2023-09-Template-Schemas#4-environment)变量。在较窄的作用域中定义的变量会覆盖范围更广的同名变量。
+ **队列环境** — 附加到 Deadline Cloud 中队列的模板。变量适用于提交到队列的所有作业。您可以使用固定值的`variables`映射来设置变量，也可以使用脚本来设置动态值。
+ **作业环境**-`jobEnvironments` 在作业模板中定义。变量适用于作业中的所有步骤和任务。作业级变量会覆盖同名的队列级变量。
+ **步骤环境**-`stepEnvironments` 在作业模板中定义。变量仅适用于该步骤中的任务。阶梯级变量会覆盖同名的作业级别或队列级变量。

## 在队列环境中设置变量
<a name="set-env-vars-queue-env"></a>

可以在队列环境中使用固定值的`variables`映射来设置环境变量，或者使用`script`带动`onEnter`作表示动态值的环境变量。

以下队列环境模板使用`variables`映射将`QT_QPA_PLATFORM`变量设置为`offscreen`，这允许使用 [Qt Fram](https://www.qt.io/product/framework) ework 的应用程序在没有交互式显示屏的情况下在工作主机上运行。

```
specificationVersion: 'environment-2023-09'
environment:
  name: QtOffscreen
  variables:
    QT_QPA_PLATFORM: offscreen
```

对于动态值，例如修改`PATH`或激活虚拟环境，请使用将格式`openjd_env: VAR=value`为 stdout 的行打印脚本。前`openjd_env:`缀为必填项。使用不带前缀的`echo``export`、或其他外壳机制不会将变量传播到作业和任务。

以下队列环境模板使用脚本设置`QT_QPA_PLATFORM`变量。

```
specificationVersion: 'environment-2023-09'
environment:
  name: QtOffscreen
  script:
    actions:
      onEnter:
        command: bash
        args:
        - "{{Env.File.Enter}}"
    embeddedFiles:
    - name: Enter
      type: TEXT
      data: |
        #!/bin/env bash
        set -euo pipefail
        echo "openjd_env: QT_QPA_PLATFORM=offscreen"
```

要将队列环境附加到您的队列，请使用 Deadline Cloud 控制台或 AWS CLI。有关更多信息，请参阅 D [e AWS adline Cloud 用户指南中的创建队列环境](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/create-queue-environment.html)。以下 AWS CLI 命令根据模板文件创建队列环境。

```
aws deadline create-queue-environment \
    --farm-id FARM_ID \
    --queue-id QUEUE_ID \
    --priority 1 \
    --template-type YAML \
    --template file://my-queue-env.yaml
```

有关更复杂的示例，例如创建和激活 conda 虚拟环境，请参阅上 GitHub的 De [adline Cloud 队列环境示例](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/queue_environments)。

## 在作业模板中设置变量
<a name="set-env-vars-job-template"></a>

在作业模板中，向`jobEnvironments`或`stepEnvironments`条目添加`variables`地图。每个条目都是一个键值对，其中键是变量名，值是变量值。

以下作业模板将`QT_QPA_PLATFORM`环境变量设置为`offscreen`，这允许使用 [Qt Fram](https://www.qt.io/product/framework) ework 的应用程序在没有交互式显示屏的情况下在工作主机上运行。

```
specificationVersion: 'jobtemplate-2023-09'
name: MyJob
jobEnvironments:
- name: JobEnv
  variables:
    QT_QPA_PLATFORM: offscreen
```

可以在单个环境定义中设置多个变量。

```
jobEnvironments:
- name: JobEnv
  variables:
    JOB_VERBOSITY: MEDIUM
    JOB_PROJECT_ID: my-project-id
    JOB_ENDPOINT_URL: https://my-host-name/my/path
    QT_QPA_PLATFORM: offscreen
```

您可以使用`{{Param.ParameterName}}`语法在变量值中引用作业参数。

```
jobEnvironments:
- name: JobEnv
  variables:
    JOB_EXAMPLE_PARAM: "{{Param.ExampleParam}}"
```

要覆盖特定步骤的作业级变量，请使用相同的变量名称定义一个`stepEnvironments`条目。以下示例`JOB_PROJECT_ID`在作业级别使用值进行定义`project-12`，然后使用覆盖步骤级别的`step-project-12`值。步骤中的任务使用步骤级别的值。

```
specificationVersion: 'jobtemplate-2023-09'
name: MyJob
jobEnvironments:
- name: JobEnv
  variables:
    JOB_PROJECT_ID: project-12
steps:
- name: MyStep
  stepEnvironments:
  - name: StepEnv
    variables:
      JOB_PROJECT_ID: step-project-12
```

## 试试看：运行环境变量示例
<a name="set-env-vars-example"></a>

Deadline Cloud 示例存储库包含一个[作业包，用于演示如何设置和查看环境变量](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_vars/template.yaml)。示例作业模板定义了作业和步骤级别的变量，然后运行打印合并结果的任务。使用以下步骤运行样本并检查结果。

### 先决条件
<a name="set-prerequisites"></a>

1. 如果您没有包含队列和关联的 Linux 队列的 Deadline Cloud 场，请按照 De [adline Cloud 控制台](https://console.aws.amazon.com/deadlinecloud/home)中的指导性入门体验创建具有默认设置的群组。

1. 如果您的工作站上没有 Deadline Cloud CLI 和 De AWS adline Cloud 监控器，请按照[设置 Deadline Cloud 提交者](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/submitter.html)中的步骤进行操作。

1. 用于克隆 D `git` e [adline Cloud 示例 GitHub存储库](https://github.com/aws-deadline/deadline-cloud-samples)。

   ```
   git clone https://github.com/aws-deadline/deadline-cloud-samples.git
   cd deadline-cloud-samples/job_bundles
   ```

### 运行示例
<a name="set-run-example"></a>

1. 使用 Deadline Cloud CLI 提交`job_env_vars`示例。

   ```
   deadline bundle submit job_env_vars
   ```

1. 在 Deadline Cloud 监视器中，选择新作业以监控其进度。与Linux队列关联的队列有工作人员可用后，任务将在几秒钟内完成。选择任务，然后在任务面板的右上角菜单中选择 “**查看日志**”。

### 将会话操作与其定义进行比较
<a name="set-compare-actions"></a>

日志视图显示三个会话操作。在文本编辑器中打开 [job\$1env\$1vars/template.yaml 文件，将每个操作与其在作业模板](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_vars/template.yaml)中的定义进行比较。

1. 选择 “**启动 JobEnv**会话” 操作。日志输出显示正在设置的作业级环境变量。

   ```
   Setting: JOB_VERBOSITY=MEDIUM
   Setting: JOB_EXAMPLE_PARAM=An example parameter value
   Setting: JOB_PROJECT_ID=project-12
   Setting: JOB_ENDPOINT_URL=https://internal-host-name/some/path
   Setting: QT_QPA_PLATFORM=offscreen
   ```

   作业模板中的以下几行定义了此环境。

   ```
   jobEnvironments:
   - name: JobEnv
     variables:
       JOB_VERBOSITY: MEDIUM
       JOB_EXAMPLE_PARAM: "{{Param.ExampleParam}}"
       JOB_PROJECT_ID: project-12
       JOB_ENDPOINT_URL: https://internal-host-name/some/path
       QT_QPA_PLATFORM: offscreen
   ```

1. 选择 “**启动 StepEnv**会话” 操作。日志输出显示步骤级变量，包括被覆盖`JOB_PROJECT_ID`的变量。

   ```
   Setting: STEP_VERBOSITY=HIGH
   Setting: JOB_PROJECT_ID=step-project-12
   ```

   作业模板中的以下几行定义了此环境。

   ```
   stepEnvironments:
   - name: StepEnv
     variables:
       STEP_VERBOSITY: HIGH
       JOB_PROJECT_ID: step-project-12
   ```

1. 选择**任务运行**会话操作。日志输出显示任务可用的合并环境变量。请注意，`JOB_PROJECT_ID`它使用的是阶梯级值`step-project-12`。

   ```
   Environment variables starting with JOB_*:
   JOB_ENDPOINT_URL=https://internal-host-name/some/path
   JOB_EXAMPLE_PARAM='An example parameter value'
   JOB_PROJECT_ID=step-project-12
   JOB_VERBOSITY=MEDIUM
   
   Environment variables starting with STEP_*:
   STEP_VERBOSITY=HIGH
   ```

# 在队列环境中设置路径
<a name="set-the-path"></a>

使用 OpenJD 环境在环境中提供新命令。首先，创建一个包含脚本文件的目录，然后将该目录添加到`PATH`环境变量中，这样脚本中的可执行文件就可以运行它们，而无需每次都指定目录路径。环境定义中的变量列表不提供修改变量的方法，因此您可以通过运行脚本来完成此操作。在脚本设置并修改之后`PATH`，它会使用命令将变量导出到 OpenJD 运行时。`echo "openjd_env: PATH=$PATH"`

## 先决条件
<a name="set-prerequisites"></a>

 执行以下步骤，[使用来自 Deadline Cloud 示例 github 存储库的环境变量运行示例作业包](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_vars/template.yaml)。

1.  如果您没有包含队列和关联的 Linux 队列的 Deadline Cloud 场，请按照 De [adline Cloud 控制台](https://console.aws.amazon.com/deadlinecloud/home)中的指导性入门体验创建具有默认设置的群组。

1.  如果您的工作站上没有 Deadline Cloud CLI 和 Deadline Cloud 监控器，请按照用户指南中[设置 Deadline Cloud 提交者](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/submitter.html)中的步骤进行操作。

1.  用于克隆 D `git` e [adline Cloud 示例 GitHub存储库](https://github.com/aws-deadline/deadline-cloud-samples)。

   ```
   git clone https://github.com/aws-deadline/deadline-cloud-samples.git
    Cloning into 'deadline-cloud-samples'...
    ...
   cd deadline-cloud-samples/job_bundles
   ```

## 运行路径示例
<a name="path-run-sample"></a>

1.  使用 Deadline Cloud CLI 提交`job_env_with_new_command`示例。

   ```
    $ deadline bundle submit job_env_with_new_command
    Submitting to Queue: MySampleQueue
    ...
   ```

1.  在 Deadline Cloud 监视器中，您将看到新作业并可以监控其进度。一旦与Linux队列关联的队列有工作人员可以运行作业的任务，该作业将在几秒钟内完成。选择任务，然后在任务面板的右上角菜单中选择 “**查看日志**” 选项。

    右边是两个会话操作：“**启动” RandomSleepCommand 和 “****任务运行”**。窗口中央的日志查看器对应于右侧选定的会话操作。

## 将会话操作与其定义进行比较
<a name="path-view-logs"></a>

在本节中，您将使用 Deadline Cloud 监视器将会话操作与作业模板中定义的会话操作进行比较。它延续了上一节。

在文本编辑器中打开 [job\$1env\$1with\$1new\$1command/temp](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_with_new_command/template.yaml) late.yaml 文件。将会话操作与作业模板中的定义位置进行比较。

1.  在 Deadline Cloud 监视器中选择 “**启动 RandomSleepCommand**会话” 操作。您将看到如下所示的日志输出。

   ```
    2024/07/16 17:25:32-07:00
    2024/07/16 17:25:32-07:00 ==============================================
    2024/07/16 17:25:32-07:00 --------- Entering Environment: RandomSleepCommand
    2024/07/16 17:25:32-07:00 ==============================================
    2024/07/16 17:25:32-07:00 ----------------------------------------------
    2024/07/16 17:25:32-07:00 Phase: Setup
    2024/07/16 17:25:32-07:00 ----------------------------------------------
    2024/07/16 17:25:32-07:00 Writing embedded files for Environment to disk.
    2024/07/16 17:25:32-07:00 Mapping: Env.File.Enter -> /sessions/session-ab132a51b9b54d5da22cbe839dd946baaw1c8hk5/embedded_filesf3tq_1os/tmpbt8j_c3f
    2024/07/16 17:25:32-07:00 Mapping: Env.File.SleepScript -> /sessions/session-ab132a51b9b54d5da22cbe839dd946baaw1c8hk5/embedded_filesf3tq_1os/tmperastlp4
    2024/07/16 17:25:32-07:00 Wrote: Enter -> /sessions/session-ab132a51b9b54d5da22cbe839dd946baaw1c8hk5/embedded_filesf3tq_1os/tmpbt8j_c3f
    2024/07/16 17:25:32-07:00 Wrote: SleepScript -> /sessions/session-ab132a51b9b54d5da22cbe839dd946baaw1c8hk5/embedded_filesf3tq_1os/tmperastlp4
    2024/07/16 17:25:32-07:00 ----------------------------------------------
    2024/07/16 17:25:32-07:00 Phase: Running action
    2024/07/16 17:25:32-07:00 ----------------------------------------------
    2024/07/16 17:25:32-07:00 Running command sudo -u job-user -i setsid -w /sessions/session-ab132a51b9b54d5da22cbe839dd946baaw1c8hk5/tmpbwrquq5u.sh
    2024/07/16 17:25:32-07:00 Command started as pid: 2205
    2024/07/16 17:25:32-07:00 Output:
    2024/07/16 17:25:33-07:00 openjd_env: PATH=/sessions/session-ab132a51b9b54d5da22cbe839dd946baaw1c8hk5/bin:/opt/conda/condabin:/home/job-user/.local/bin:/home/job-user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/var/lib/snapd/snap/bin
    No newer logs at this moment.
   ```

    作业模板中的以下几行指定了此操作。

   ```
    jobEnvironments:
    - name: RandomSleepCommand
      description: Adds a command 'random-sleep' to the environment.
      script:
        actions:
          onEnter:
            command: bash
            args:
            - "{{Env.File.Enter}}"
        embeddedFiles:
        - name: Enter
          type: TEXT
          data: |
            #!/bin/env bash
            set -euo pipefail
   
            # Make a bin directory inside the session's working directory for providing new commands
            mkdir -p '{{Session.WorkingDirectory}}/bin'
   
            # If this bin directory is not already in the PATH, then add it
            if ! [[ ":$PATH:" == *':{{Session.WorkingDirectory}}/bin:'* ]]; then
              export "PATH={{Session.WorkingDirectory}}/bin:$PATH"
   
              # This message to Open Job Description exports the new PATH value to the environment
              echo "openjd_env: PATH=$PATH"
            fi
   
            # Copy the SleepScript embedded file into the bin directory
            cp '{{Env.File.SleepScript}}' '{{Session.WorkingDirectory}}/bin/random-sleep'
            chmod u+x '{{Session.WorkingDirectory}}/bin/random-sleep'
        - name: SleepScript
          type: TEXT
          runnable: true
          data: |
            ...
   ```

1.  在 Deadline Cloud 监视器中选择 “**启动 StepEnv**会话” 操作。您将看到如下所示的日志输出。

   ```
    2024/07/16 17:25:33-07:00
    2024/07/16 17:25:33-07:00 ==============================================
    2024/07/16 17:25:33-07:00 --------- Running Task
    2024/07/16 17:25:33-07:00 ==============================================
    2024/07/16 17:25:33-07:00 ----------------------------------------------
    2024/07/16 17:25:33-07:00 Phase: Setup
    2024/07/16 17:25:33-07:00 ----------------------------------------------
    2024/07/16 17:25:33-07:00 Writing embedded files for Task to disk.
    2024/07/16 17:25:33-07:00 Mapping: Task.File.Run -> /sessions/session-ab132a51b9b54d5da22cbe839dd946baaw1c8hk5/embedded_filesf3tq_1os/tmpdrwuehjf
    2024/07/16 17:25:33-07:00 Wrote: Run -> /sessions/session-ab132a51b9b54d5da22cbe839dd946baaw1c8hk5/embedded_filesf3tq_1os/tmpdrwuehjf
    2024/07/16 17:25:33-07:00 ----------------------------------------------
    2024/07/16 17:25:33-07:00 Phase: Running action
    2024/07/16 17:25:33-07:00 ----------------------------------------------
    2024/07/16 17:25:33-07:00 Running command sudo -u job-user -i setsid -w /sessions/session-ab132a51b9b54d5da22cbe839dd946baaw1c8hk5/tmpz81iaqfw.sh
    2024/07/16 17:25:33-07:00 Command started as pid: 2256
    2024/07/16 17:25:33-07:00 Output:
    2024/07/16 17:25:34-07:00 + random-sleep 12.5 27.5
    2024/07/16 17:26:00-07:00 Sleeping for duration 26.90
    2024/07/16 17:26:00-07:00 ----------------------------------------------
    2024/07/16 17:26:00-07:00 Uploading output files to Job Attachments
    2024/07/16 17:26:00-07:00 ----------------------------------------------
   ```

1.  作业模板中的以下几行指定了此操作。

   ```
    steps:
    - name: EnvWithCommand
      script:
        actions:
          onRun:
            command: bash
            args:
            - '{{Task.File.Run}}'
        embeddedFiles:
        - name: Run
          type: TEXT
          data: |
            set -xeuo pipefail
   
            # Run the script installed into PATH by the job environment
            random-sleep 12.5 27.5
      hostRequirements:
        attributes:
        - name: attr.worker.os.family
          anyOf:
          - linux
   ```

# 在队列环境中运行后台守护进程
<a name="run-a-background-daemon-process"></a>

 在许多渲染用例中，加载应用程序和场景数据可能需要大量时间。如果作业每帧都重新加载它们，则会将大部分时间花在开销上。通常可以将应用程序作为后台守护进程加载一次，让它加载场景数据，然后通过进程间通信 (IPC) 向其发送命令以执行渲染。

 许多开源 Deadline Cloud 集成都使用这种模式。Open Job Description 项目提供了一个[适配器运行时库](https://github.com/OpenJobDescription/openjd-adaptor-runtime-for-python)，该库在所有支持的操作系统上都具有强大的 IPC 模式。

 为了演示这种模式，有一个[独立的示例任务包](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_daemon_process/template.yaml)，它使用 Python 和 bash 代码来实现后台守护程序，并使用 IPC 来实现任务与之通信。该守护程序是用 Python 实现的，它监听 POSIX SIGUSR1 信号以了解何时处理任务。任务详细信息以特定的 JSON 文件形式传递给守护程序，运行任务的结果将作为另一个 JSON 文件返回。

## 先决条件
<a name="daemon-prerequisites"></a>

 执行以下步骤，[使用来自 Deadline Cloud 示例 github 存储库的守护程序进程运行示例作业包](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_daemon_process/template.yaml)。

1.  如果您没有包含队列和关联的 Linux 队列的 Deadline Cloud 场，请按照 De [adline Cloud 控制台](https://console.aws.amazon.com/deadlinecloud/home)中的指导性入门体验创建具有默认设置的群组。

1.  如果您的工作站上没有 Deadline Cloud CLI 和 Deadline Cloud 监控器，请按照用户指南中[设置 Deadline Cloud 提交者](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/submitter.html)中的步骤进行操作。

1.  用于克隆 D `git` e [adline Cloud 示例 GitHub存储库](https://github.com/aws-deadline/deadline-cloud-samples)。

   ```
   git clone https://github.com/aws-deadline/deadline-cloud-samples.git
    Cloning into 'deadline-cloud-samples'...
    ...
   cd deadline-cloud-samples/job_bundles
   ```

## 运行守护程序示例
<a name="daemon-run-sample"></a>

1.  使用 Deadline Cloud CLI 提交`job_env_daemon_process`示例。

   ```
    git clone https://github.com/aws-deadline/deadline-cloud-samples.git
   Cloning into 'deadline-cloud-samples'...
    ...
   cd deadline-cloud-samples/job_bundles
   ```

1.  在 Deadline Cloud 监控应用程序中，您将看到新作业并可以监控其进度。一旦与Linux队列关联的队列有工作人员可以运行作业的任务，该任务将在大约一分钟后完成。选择其中一项任务后，在任务面板的右上角菜单中选择 “**查看日志**” 选项。

    右侧有两个会话操作：“**启动” DaemonProcess 和 “****任务运行”**。窗口中央的日志查看器对应于右侧选定的会话操作。

    选择 “**查看所有任务的日志**” 选项。时间轴显示了作为会话一部分运行的其余任务以及退出环境的`Shut down DaemonProcess`操作。

## 查看守护程序日志
<a name="daemon-view-logs"></a>

1. 在本节中，您将使用 Deadline Cloud 监视器将会话操作与作业模板中定义的会话操作进行比较。它延续了上一节。

    在文本编辑器中打开 [job\$1env\$1daemon\$1process/temp](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_daemon_process/template.yaml) late.yaml 文件。将会话操作与作业模板中的定义位置进行比较。

1.  在 Deadline Cloud 监视器中选择`Launch DaemonProcess`会话操作。您将看到如下所示的日志输出。

   ```
    2024/07/17 16:27:20-07:00
    2024/07/17 16:27:20-07:00 ==============================================
    2024/07/17 16:27:20-07:00 --------- Entering Environment: DaemonProcess
    2024/07/17 16:27:20-07:00 ==============================================
    2024/07/17 16:27:20-07:00 ----------------------------------------------
    2024/07/17 16:27:20-07:00 Phase: Setup
    2024/07/17 16:27:20-07:00 ----------------------------------------------
    2024/07/17 16:27:20-07:00 Writing embedded files for Environment to disk.
    2024/07/17 16:27:20-07:00 Mapping: Env.File.Enter -> /sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/embedded_fileswy00x5ra/enter-daemon-process-env.sh
    2024/07/17 16:27:20-07:00 Mapping: Env.File.Exit -> /sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/embedded_fileswy00x5ra/exit-daemon-process-env.sh
    2024/07/17 16:27:20-07:00 Mapping: Env.File.DaemonScript -> /sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/embedded_fileswy00x5ra/daemon-script.py
    2024/07/17 16:27:20-07:00 Mapping: Env.File.DaemonHelperFunctions -> /sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/embedded_fileswy00x5ra/daemon-helper-functions.sh
    2024/07/17 16:27:20-07:00 Wrote: Enter -> /sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/embedded_fileswy00x5ra/enter-daemon-process-env.sh
    2024/07/17 16:27:20-07:00 Wrote: Exit -> /sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/embedded_fileswy00x5ra/exit-daemon-process-env.sh
    2024/07/17 16:27:20-07:00 Wrote: DaemonScript -> /sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/embedded_fileswy00x5ra/daemon-script.py
    2024/07/17 16:27:20-07:00 Wrote: DaemonHelperFunctions -> /sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/embedded_fileswy00x5ra/daemon-helper-functions.sh
    2024/07/17 16:27:20-07:00 ----------------------------------------------
    2024/07/17 16:27:20-07:00 Phase: Running action
    2024/07/17 16:27:20-07:00 ----------------------------------------------
    2024/07/17 16:27:20-07:00 Running command sudo -u job-user -i setsid -w /sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/tmp_u8slys3.sh
    2024/07/17 16:27:20-07:00 Command started as pid: 2187
    2024/07/17 16:27:20-07:00 Output:
    2024/07/17 16:27:21-07:00 openjd_env: DAEMON_LOG=/sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/daemon.log
    2024/07/17 16:27:21-07:00 openjd_env: DAEMON_PID=2223
    2024/07/17 16:27:21-07:00 openjd_env: DAEMON_BASH_HELPER_SCRIPT=/sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/embedded_fileswy00x5ra/daemon-helper-functions.sh
   ```

    作业模板中的以下几行指定了此操作。

   ```
      stepEnvironments:
      - name: DaemonProcess
        description: Runs a daemon process for the step's tasks to share.
        script:
          actions:
            onEnter:
              command: bash
              args:
              - "{{Env.File.Enter}}"
            onExit:
              command: bash
              args:
              - "{{Env.File.Exit}}"
          embeddedFiles:
          - name: Enter
            filename: enter-daemon-process-env.sh
            type: TEXT
            data: |
              #!/bin/env bash
              set -euo pipefail
   
              DAEMON_LOG='{{Session.WorkingDirectory}}/daemon.log'
              echo "openjd_env: DAEMON_LOG=$DAEMON_LOG"
              nohup python {{Env.File.DaemonScript}} > $DAEMON_LOG 2>&1 &
              echo "openjd_env: DAEMON_PID=$!"
              echo "openjd_env: DAEMON_BASH_HELPER_SCRIPT={{Env.File.DaemonHelperFunctions}}"
   
              echo 0 > 'daemon_log_cursor.txt'
        ...
   ```

1.  在 Deadline Cloud 监视器中选择 “任务运行：N 会话” 操作之一。您将看到如下所示的日志输出。

   ```
   2024/07/17 16:27:22-07:00
    2024/07/17 16:27:22-07:00 ==============================================
    2024/07/17 16:27:22-07:00 --------- Running Task
    2024/07/17 16:27:22-07:00 ==============================================
    2024/07/17 16:27:22-07:00 Parameter values:
    2024/07/17 16:27:22-07:00 Frame(INT) = 2
    2024/07/17 16:27:22-07:00 ----------------------------------------------
    2024/07/17 16:27:22-07:00 Phase: Setup
    2024/07/17 16:27:22-07:00 ----------------------------------------------
    2024/07/17 16:27:22-07:00 Writing embedded files for Task to disk.
    2024/07/17 16:27:22-07:00 Mapping: Task.File.Run -> /sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/embedded_fileswy00x5ra/run-task.sh
    2024/07/17 16:27:22-07:00 Wrote: Run -> /sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/embedded_fileswy00x5ra/run-task.sh
    2024/07/17 16:27:22-07:00 ----------------------------------------------
    2024/07/17 16:27:22-07:00 Phase: Running action
    2024/07/17 16:27:22-07:00 ----------------------------------------------
    2024/07/17 16:27:22-07:00 Running command sudo -u job-user -i setsid -w /sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/tmpv4obfkhn.sh
    2024/07/17 16:27:22-07:00 Command started as pid: 2301
    2024/07/17 16:27:22-07:00 Output:
    2024/07/17 16:27:23-07:00 Daemon PID is 2223
    2024/07/17 16:27:23-07:00 Daemon log file is /sessions/session-972e21d98dde45e59c7153bd9258a64dohwg4yg1/daemon.log
    2024/07/17 16:27:23-07:00
    2024/07/17 16:27:23-07:00 === Previous output from daemon
    2024/07/17 16:27:23-07:00 ===
    2024/07/17 16:27:23-07:00
    2024/07/17 16:27:23-07:00 Sending command to daemon
    2024/07/17 16:27:23-07:00 Received task result:
    2024/07/17 16:27:23-07:00 {
    2024/07/17 16:27:23-07:00   "result": "SUCCESS",
    2024/07/17 16:27:23-07:00   "processedTaskCount": 1,
    2024/07/17 16:27:23-07:00   "randomValue": 0.2578537967668988,
    2024/07/17 16:27:23-07:00   "failureRate": 0.1
    2024/07/17 16:27:23-07:00 }
    2024/07/17 16:27:23-07:00
    2024/07/17 16:27:23-07:00 === Daemon log from running the task
    2024/07/17 16:27:23-07:00 Loading the task details file
    2024/07/17 16:27:23-07:00 Received task details:
    2024/07/17 16:27:23-07:00 {
    2024/07/17 16:27:23-07:00  "pid": 2329,
    2024/07/17 16:27:23-07:00  "frame": 2
    2024/07/17 16:27:23-07:00 }
    2024/07/17 16:27:23-07:00 Processing frame number 2
    2024/07/17 16:27:23-07:00 Writing result
    2024/07/17 16:27:23-07:00 Waiting until a USR1 signal is sent...
    2024/07/17 16:27:23-07:00 ===
    2024/07/17 16:27:23-07:00
    2024/07/17 16:27:23-07:00 ----------------------------------------------
    2024/07/17 16:27:23-07:00 Uploading output files to Job Attachments
    2024/07/17 16:27:23-07:00 ----------------------------------------------
   ```

    作业模板中的以下几行是指定此操作的内容。```步骤：

   ```
    steps:
    - name: EnvWithDaemonProcess
      parameterSpace:
        taskParameterDefinitions:
        - name: Frame
          type: INT
          range: "{{Param.Frames}}"
   
      stepEnvironments:
        ...
   
      script:
        actions:
          onRun:
            timeout: 60
            command: bash
            args:
            - '{{Task.File.Run}}'
        embeddedFiles:
        - name: Run
          filename: run-task.sh
          type: TEXT
          data: |
            # This bash script sends a task to the background daemon process,
            # then waits for it to respond with the output result.
   
            set -euo pipefail
   
            source "$DAEMON_BASH_HELPER_SCRIPT"
   
            echo "Daemon PID is $DAEMON_PID"
            echo "Daemon log file is $DAEMON_LOG"
   
            print_daemon_log "Previous output from daemon"
   
            send_task_to_daemon "{\"pid\": $$, \"frame\": {{Task.Param.Frame}} }"
            wait_for_daemon_task_result
   
            echo Received task result:
            echo "$TASK_RESULT" | jq .
   
            print_daemon_log "Daemon log from running the task"
   
      hostRequirements:
        attributes:
        - name: attr.worker.os.family
          anyOf:
          - linux
   ```

# 为您的工作提供申请
<a name="provide-applications"></a>

您可以使用队列环境加载应用程序来处理您的作业。使用 Deadline Cloud 控制台创建服务管理队列时，您可以选择创建使用 conda 包管理器加载应用程序的队列环境。

如果要使用其他包管理器，可以为该管理器创建队列环境。有关使用 Rez 的示例，请参见[使用其他软件包管理器](#provide-applications-other-package)。

Deadline Cloud 提供了一个 conda 通道，用于将精选的渲染应用程序加载到您的环境中。他们支持 Deadline Cloud 为数字内容创作应用程序提供的提交者。

你也可以加载软件让 conda-forge 在你的工作中使用。以下示例显示了在运行作业之前使用 Deadline Cloud 提供的队列环境加载应用程序的作业模板。

**Topics**
+ [从 conda 频道获取应用程序](#provide-applications-get-application)
+ [使用其他软件包管理器](#provide-applications-other-package)

## 从 conda 频道获取应用程序
<a name="provide-applications-get-application"></a>

您可以为 Deadline Cloud 工作人员创建自定义队列环境，安装您选择的软件。此示例队列环境的行为与控制台用于服务管理队列的环境相同。它直接运行 conda 来创建环境。

该环境为在工作器上运行的每个 Deadline Cloud 会话创建一个新的 conda 虚拟环境，然后在完成后删除该环境。

Conda 会缓存下载的软件包，这样就不需要再次下载了，但是每个会话都必须将所有软件包链接到环境中。

该环境定义了三个脚本，这些脚本在 Deadline Cloud 在工作人员上启动会话时运行。第一个脚本在调用`onEnter`操作时运行。它调用另外两个来设置环境变量。脚本运行完毕后，conda 环境将可用，并设置了所有指定的环境变量。

有关该示例的最新版本，请参阅上存储库中的 [conda\$1queue\$1env\$1console\$1equeuvalen](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/queue_environments/conda_queue_env_console_equivalent.yaml) t.yaml。[deadline-cloud-samples](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline) GitHub

如果您想使用 conda 频道中没有的应用程序，则可以在 Amazon S3 中创建一个 conda 频道，然后为该应用程序构建自己的软件包。请参阅 [使用 S3 创建 conda 频道](configure-jobs-s3-channel.md)，了解更多信息。

### 从 conda-forge 获取开源库
<a name="get-application-csv-example"></a>

本节介绍如何使用`conda-forge`频道中的开源库。以下示例是使用 `polars` Python 包的作业模板。

该任务设置队列环境中定义的`CondaPackages`和`CondaChannels`参数，这些参数告诉 Deadline Cloud 在哪里获取软件包。

作业模板中设置参数的部分是：

```
- name: CondaPackages
  description: A list of conda packages to install. The job expects a Queue Environment to handle this.
  type: STRING
  default: polars
- name: CondaChannels
  description: A list of conda channels to get packages from. The job expects a Queue Environment to handle this.
  type: STRING
  default: conda-forge
```

有关完整示例作业模板的最新版本，请参阅 [stage](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/job_bundles/job_dev_progression/stage_1_self_contained_template/template.yaml) \$11\$1self\$1contained\$1template/template.yaml。有关加载 conda 包的队列环境的最新版本，请参阅上存储库中的 conda\$1queue\$1env\$1console [\$1equeuval](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/queue_environments/conda_queue_env_console_equivalent.yaml) ent.yaml。[deadline-cloud-samples](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline) GitHub

### Blender从 deadline-cloud 频道获取
<a name="get-application-blender"></a>

以下示例显示了Blender从 `deadline-cloud` conda 频道获取的作业模板。该频道支持 Deadline Cloud 为数字内容创作软件提供的提交者，但您可以使用相同的渠道加载软件供自己使用。

有关该`deadline-cloud`频道提供的软件列表，请参阅 De *AWS adline Cloud 用户指南*中的[默认队列环境](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/create-queue-environment.html#conda-queue-environment)。

此作业设置队列环境中定义的`CondaPackages`参数，告诉 Deadline Cloud 加载Blender到环境中。

作业模板中设置参数的部分是：

```
- name: CondaPackages
  type: STRING
  userInterface:
    control: LINE_EDIT
    label: Conda Packages
    groupLabel: Software Environment
  default: blender
  description: >
    Tells the queue environment to install Blender from the deadline-cloud conda channel.
```

有关完整示例作业模板的最新版本，请参阅 [blender\$1render/template](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/job_bundles/blender_render/template.yaml) .yaml。有关加载 conda 包的队列环境的最新版本，请参阅上存储库中的 conda\$1queue\$1env\$1console [\$1equeuval](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/queue_environments/conda_queue_env_console_equivalent.yaml) ent.yaml。[deadline-cloud-samples](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline)GitHub

## 使用其他软件包管理器
<a name="provide-applications-other-package"></a>

Deadline Cloud 的默认包管理器是 conda。如果您需要使用其他包管理器（例如）Rez，则可以创建一个自定义队列环境，其中包含使用您的包管理器的脚本。

此示例队列环境提供的行为与控制台用于服务管理队列的环境相同。它将 conda 包管理器替Rez换为。

该环境定义了三个脚本，这些脚本在 Deadline Cloud 在工作人员上启动会话时运行。第一个脚本在调用`onEnter`操作时运行。它调用另外两个来设置环境变量。脚本运行完毕后，设置了Rez所有指定的环境变量的环境即可使用。

该示例假设您有一个客户管理的队列，该队列使用共享文件系统来处理 Rez 软件包。

有关该示例的最新版本，请参阅上存储库中的 [rez\$1queue\$1env](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/queue_environments/rez_queue_env.yaml) .yaml。[deadline-cloud-samples](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline)GitHub