

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用佇列環境設定任務
<a name="configure-jobs"></a>

AWS Deadline Cloud 使用*佇列環境*在工作者上設定軟體。環境可讓您對工作階段中的所有任務執行一次耗時的任務，例如設定和捨棄。它定義了啟動或停止工作階段時要在工作者上執行的動作。您可以為佇列設定環境、在佇列中執行的任務，以及任務的個別步驟。

您可以將環境定義為佇列環境或任務環境。使用截止日期雲端主控台或[截止日期：CreateQueueEnvironment](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateQueueEnvironment.html) 操作建立佇列環境，並在您提交之任務的任務範本中定義任務環境。它們遵循環境的開放任務描述 (OpenJD) 規格。如需詳細資訊，請參閱 GitHub 上 OpenJD 規格中的 [<Environment>](https://github.com/OpenJobDescription/openjd-specifications/wiki/2023-09-Template-Schemas#4-environment)。

除了 `name`和 之外`description`，每個環境還包含兩個在主機上定義環境的欄位。這些類別為：
+ `script` – 在工作者上執行此環境時所採取的動作。
+ `variables` – 一組在進入環境時設定的環境變數名稱/值對。

您必須設定至少一個 `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>

許多應用程式和架構使用環境變數來控制功能設定、記錄層級和顯示組態。您可以使用[開放任務描述 (OpenJD) 環境](https://github.com/OpenJobDescription/openjd-specifications/wiki/2023-09-Template-Schemas#4-environment)來設定其範圍內每個任務命令繼承的環境變數。

## 環境變數範圍
<a name="set-env-vars-scope"></a>

AWS 截止日期 雲端會從您連接至佇列的佇列環境套用環境變數。在任務範本中，您也可以使用 [OpenJD 環境在任務和步驟層級定義環境](https://github.com/OpenJobDescription/openjd-specifications/wiki/2023-09-Template-Schemas#4-environment)變數。在較窄範圍定義的變數會覆寫具有較廣泛範圍相同名稱的變數。
+ **佇列環境** – 您附加至截止日期雲端中佇列的範本。變數會套用至提交至佇列的所有任務。您可以使用固定值的`variables`映射來設定變數，或使用動態值的指令碼。
+ **任務環境** – 在任務範本`jobEnvironments`的 下定義。變數適用於任務中的所有步驟和任務。任務層級變數會以相同名稱覆寫佇列層級變數。
+ **步驟環境** – 在任務範本`stepEnvironments`的 下定義。變數僅適用於該步驟中的任務。步驟層級變數會以相同名稱覆寫任務層級或佇列層級變數。

## 在佇列環境中設定變數
<a name="set-env-vars-queue-env"></a>

您可以使用固定值的`variables`映射，或在動態值`script`的 `onEnter` 動作中使用 ，在佇列環境中設定環境變數。

下列佇列環境範本使用`variables`映射將`QT_QPA_PLATFORM`變數設定為 `offscreen`，這可讓使用 [Qt 架構](https://www.qt.io/product/framework)的應用程式在沒有互動式顯示的工作者主機上執行。

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

對於動態值，例如修改`PATH`或啟用虛擬環境，請使用以 `openjd_env: VAR=value`stdout 格式列印行的指令碼。字`openjd_env:`首為必要。使用 `echo`、 `export`或其他不含字首的 Shell 機制，不會將變數傳播至任務。

下列佇列環境範本會使用指令碼設定`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"
```

若要將佇列環境連接至佇列，請使用截止日期雲端主控台或 AWS CLI。如需詳細資訊，請參閱《 AWS 截止日期雲端使用者指南》中的[建立佇列環境](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 上的[截止日期雲端佇列環境範例](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/queue_environments)。

## 在任務範本中設定變數
<a name="set-env-vars-job-template"></a>

在任務範本中，將`variables`映射新增至 `jobEnvironments`或 `stepEnvironments`項目。每個項目都是索引鍵/值對，其中索引鍵是變數名稱，而值是變數值。

下列任務範本會將 `QT_QPA_PLATFORM` 環境變數設定為 `offscreen`，允許使用 [Qt Framework](https://www.qt.io/product/framework) 的應用程式在沒有互動式顯示的工作者主機上執行。

```
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 機群的截止日期雲端陣列，請遵循[截止日期雲端主控台](https://console.aws.amazon.com/deadlinecloud/home)中的引導式加入體驗，以使用預設設定建立。

1. 如果您的工作站上沒有截止日期雲端 CLI AWS 和截止日期雲端監視器，請遵循[設定截止日期雲端提交者](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/submitter.html)中的步驟。

1. 使用 `git`複製[截止日期雲端範例 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. 使用截止日期雲端 CLI 提交`job_env_vars`範例。

   ```
   deadline bundle submit job_env_vars
   ```

1. 在截止日期雲端監視器中，選取要監控其進度的新任務。與佇列相關聯的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 機群的截止日期雲端陣列，請遵循[截止日期雲端主控台](https://console.aws.amazon.com/deadlinecloud/home)中的引導式加入體驗，以使用預設設定建立。

1.  如果您的工作站上沒有截止日期雲端 CLI 和截止日期雲端監視器，請遵循使用者指南中[設定截止日期雲端提交者](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/submitter.html)中的步驟。

1.  使用 `git`複製[截止日期雲端範例 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.  使用截止日期雲端 CLI 提交`job_env_with_new_command`範例。

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

1.  在截止日期雲端監視器中，您會看到新任務，並且可以監控其進度。一旦與佇列相關聯的Linux機群有工作者可執行任務，任務會在幾秒鐘內完成。選取任務，然後選擇任務面板右上角選單中的**檢視日誌**選項。

    右側有兩個工作階段動作：**啟動 RandomSleepCommand** 和**任務執行**。視窗中央的日誌檢視器對應至右側的所選工作階段動作。

## 比較工作階段動作及其定義
<a name="path-view-logs"></a>

在本節中，您會使用截止日期雲端監視器來比較工作階段動作與任務範本中定義它們的位置。它從上一節繼續。

在文字編輯器中開啟檔案 [job\$1env\$1with\$1new\$1command/template.yaml。](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_with_new_command/template.yaml)將工作階段動作與任務範本中定義它們的位置進行比較。

1.  在截止日期雲端監視器中選取**啟動 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.  在截止日期雲端監視器中選取**啟動 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) 傳送命令來執行轉譯。

 許多開放原始碼截止日期雲端整合都使用此模式。開放任務描述專案在所有支援的作業系統上，提供具有強大 IPC 模式的[轉接器執行期程式庫](https://github.com/OpenJobDescription/openjd-adaptor-runtime-for-python)。

 為了示範此模式，有一個[獨立的範例任務套件](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 機群的截止日期雲端陣列，請遵循[截止日期雲端主控台](https://console.aws.amazon.com/deadlinecloud/home)中的引導式加入體驗，以使用預設設定建立。

1.  如果您的工作站上沒有截止日期雲端 CLI 和截止日期雲端監視器，請遵循使用者指南中[設定截止日期雲端提交者](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/submitter.html)中的步驟。

1.  使用 `git`複製[截止日期雲端範例 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.  使用截止日期雲端 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.  在截止日期雲端監控應用程式中，您會看到新的任務，並且可以監控其進度。一旦與佇列相關聯的Linux機群有工作者可執行任務，大約會在一分鐘內完成。選取其中一個任務後，選擇任務面板右上角選單中的**檢視日誌**選項。

    右側有兩個工作階段動作：**啟動 DaemonProcess** 和**任務執行**。視窗中央的日誌檢視器對應至右側的所選工作階段動作。

    選取**檢視所有任務的日誌**選項。時間軸會顯示在工作階段中執行的其餘任務，以及結束環境`Shut down DaemonProcess`的動作。

## 檢視協助程式日誌
<a name="daemon-view-logs"></a>

1. 在本節中，您會使用截止日期雲端監視器來比較工作階段動作與任務範本中定義它們的位置。它從上一節繼續。

    在文字編輯器中開啟檔案 [job\$1env\$1daemon\$1process/template.yaml](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_daemon_process/template.yaml)。將工作階段動作與任務範本中定義它們的位置進行比較。

1.  在截止日期雲端監視器中選取`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.  在截止日期雲端監視器中選取其中一個任務執行：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>

您可以使用佇列環境載入應用程式來處理任務。當您使用截止日期雲端主控台建立服務受管機群時，您可以選擇建立使用 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>

您可以為安裝所選軟體的截止日期雲端工作者建立自訂佇列環境。此範例佇列環境的行為與主控台用於服務受管機群的環境相同。它會直接執行 conda 以建立環境。

環境會為每個在工作者上執行的截止日期雲端工作階段建立新的 conda 虛擬環境，然後在完成時刪除環境。

Conda 會快取下載的套件，使其不需要再次下載，但每個工作階段都必須將所有套件連結至環境。

環境定義了三種指令碼，當 Deadline Cloud 在工作者上啟動工作階段時執行。第一個指令碼會在呼叫`onEnter`動作時執行。它會呼叫其他兩個 來設定環境變數。當指令碼完成執行時，Conda 環境可用於所有指定的環境變數集。

如需範例的最新版本，請參閱 GitHub 上 [deadline-cloud-samples](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline) 儲存庫中的 [conda\$1queue\$1env\$1console\$1equivalent.yaml](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/queue_environments/conda_queue_env_console_equivalent.yaml)。

如果您想要使用 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\$11\$1self\$1contained\$1template/template.yaml。](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/job_bundles/job_dev_progression/stage_1_self_contained_template/template.yaml)如需載入 conda 套件的最新版本佇列環境，請參閱 GitHub 上 [deadline-cloud-samples](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline) 儲存庫中的 [conda\$1queue\$1env\$1console\$1equivalent.yaml](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/queue_environments/conda_queue_env_console_equivalent.yaml)。

### Blender 從截止日期雲端管道取得
<a name="get-application-blender"></a>

下列範例顯示Blender從 `deadline-cloud` conda 頻道取得的任務範本。此頻道支援 Deadline Cloud 為數位內容建立軟體提供的提交者，但您可以使用相同的頻道來載入軟體供自己使用。

如需`deadline-cloud`頻道提供的軟體清單，請參閱*AWS 《截止日期雲端使用者指南*》中的[預設佇列環境](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/create-queue-environment.html#conda-queue-environment)。

此任務會設定佇列環境中定義的 `CondaPackages` 參數，以指示截止日期雲端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.yaml](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/job_bundles/blender_render/template.yaml)。如需載入 conda 套件的最新版本佇列環境，請參閱 上 [deadline-cloud-samples](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline) 儲存庫中的 [conda\$1queue\$1env\$1console\$1equivalent.yaml](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/queue_environments/conda_queue_env_console_equivalent.yaml)GitHub。

## 使用不同的套件管理員
<a name="provide-applications-other-package"></a>

截止日期雲端的預設套件管理員為 conda。如果您需要使用不同的套件管理員，例如 Rez，您可以建立自訂佇列環境，其中包含改用套件管理員的指令碼。

此範例佇列環境提供與主控台用於服務受管機群的環境相同的行為。它會以 取代 conda 套件管理員Rez。

環境定義了三種指令碼，當 Deadline Cloud 在工作者上啟動工作階段時執行。第一個指令碼會在呼叫`onEnter`動作時執行。它會呼叫其他兩個 來設定環境變數。當指令碼完成執行時，Rez環境可使用所有指定的環境變數集。

此範例假設您有一個客戶受管機群，該機群使用 Rez 套件的共用檔案系統。

如需範例的最新版本，請參閱 上 [deadline-cloud-samples](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline) 儲存庫中的 [rez\$1queue\$1env.yaml。](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/queue_environments/rez_queue_env.yaml) GitHub