

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 대기열 환경을 사용하여 작업 구성
<a name="configure-jobs"></a>

AWS Deadline Cloud는 *대기열 환경을* 사용하여 작업자에 소프트웨어를 구성합니다. 환경을 사용하면 세션의 모든 작업에 대해 설정 및 제거와 같은 시간이 많이 걸리는 작업을 한 번 수행할 수 있습니다. 세션을 시작하거나 중지할 때 작업자에서 실행할 작업을 정의합니다. 대기열에 대한 환경, 대기열에서 실행되는 작업 및 작업에 대한 개별 단계를 구성할 수 있습니다.

환경을 대기열 환경 또는 작업 환경으로 정의합니다. Deadline Cloud 콘솔 또는 [deadline:CreateQueueEnvironment](https://docs.aws.amazon.com/deadline-cloud/latest/APIReference/API_CreateQueueEnvironment.html) 작업을 사용하여 대기열 환경을 생성하고 제출하는 작업의 작업 템플릿에서 작업 환경을 정의합니다. 환경에 대한 Open Job Description(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는 [Open Job Description(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>

많은 애플리케이션 및 프레임워크는 환경 변수를 사용하여 기능 설정, 로깅 수준 및 표시 구성을 제어합니다. [Open 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` 맵을 사용하거나 동적 값에 대한 `onEnter` 작업과 `script` 함께를 사용하여 대기열 환경에서 환경 변수를 설정할 수 있습니다.

다음 대기열 환경 템플릿은 `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` 또는 활성화와 같은 동적 값의 경우 형식으로 줄을 인쇄하여 stdout하는 스크립트`openjd_env: VAR=value`를 사용합니다. `openjd_env:` 접두사는 필수입니다. 접두사 없이 `export`, 또는 기타 `echo`쉘 메커니즘을 사용하면 변수가 작업 및 작업에 전파되지 않습니다.

다음 대기열 환경 템플릿은 스크립트를 사용하여 `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. 자세한 내용은 AWS Deadline 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의 [Deadline 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 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 플릿이 있는 Deadline Cloud 팜이 없는 경우 Deadline Cloud [콘솔의 안내 온보딩 환경에 따라 기본 설정으로 Deadline Cloud](https://console.aws.amazon.com/deadlinecloud/home) 팜을 생성합니다.

1. 워크스테이션에 Deadline Cloud CLI 및 AWS Deadline Cloud 모니터가 없는 경우 [Deadline Cloud 제출자 설정](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/submitter.html)의 단계를 따릅니다.

1. `git`를 사용하여 [Deadline 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 팜이 없는 경우 Deadline Cloud [콘솔의 안내 온보딩 환경에 따라 기본 설정으로 Deadline 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.  `git`를 사용하여 [Deadline 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/template.yaml](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_with_new_command/template.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 프로젝트는 지원되는 모든 운영 체제에서 강력한 IPC 패턴을 갖춘 [어댑터 런타임 라이브러리](https://github.com/OpenJobDescription/openjd-adaptor-runtime-for-python)를 제공합니다.

 이 패턴을 보여주기 위해 Python 및 bash 코드를 사용하여 백그라운드 데몬을 구현하고 작업과 통신할 IPC를 구현하는 [독립형 샘플 작업 번들](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_daemon_process/template.yaml)이 있습니다. 데몬은 Python에서 구현되며 작업을 처리할 시기에 대한 POSIX SIGUSR1 신호를 수신합니다. 작업 세부 정보는 특정 JSON 파일의 데몬으로 전달되고 작업 실행 결과는 다른 JSON 파일로 반환됩니다.

## 사전 조건
<a name="daemon-prerequisites"></a>

 Deadline Cloud [samples github 리포지토리에서 데몬 프로세스를 사용하여 샘플 작업 번들](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_daemon_process/template.yaml)을 실행하려면 다음 단계를 수행합니다.

1.  대기열 및 연결된 Linux 플릿이 있는 Deadline Cloud 팜이 없는 경우 Deadline Cloud [콘솔의 안내 온보딩 환경에 따라 기본 설정으로 Deadline 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.  `git`를 사용하여 [Deadline 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플릿에 작업의 작업을 실행할 수 있는 작업자가 있으면 약 1분 후에 완료됩니다. 작업 중 하나를 선택한 상태에서 작업 패널의 오른쪽 상단 메뉴에서 **로그 보기** 옵션을 선택합니다.

    오른쪽에는 ** DaemonProcess 시작**과 **Task 실행**이라는 두 가지 세션 작업이 있습니다. 창 중앙의 로그 뷰어는 오른쪽에서 선택한 세션 작업에 해당합니다.

    **모든 작업에 대한 로그 보기** 옵션을 선택합니다. 타임라인에는 세션의 일부로 실행된 나머지 작업과 환경을 종료한 `Shut down DaemonProcess` 작업이 표시됩니다.

## 데몬 로그 보기
<a name="daemon-view-logs"></a>

1. 이 섹션에서는 Deadline Cloud 모니터를 사용하여 세션 작업을 작업 템플릿에 정의된 위치와 비교합니다. 이전 섹션에서 계속됩니다.

    텍스트 편집기에서 [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.  Deadline Cloud Monitor에서 `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 Monitor에서 작업 실행: 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 환경을 사용할 수 있습니다.

예제의 최신 버전은 GitHub의 deadline-cloud-samples 리포지토리에서 [conda\$1queue\$1env\$1console\$1equivalent.yaml](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/queue_environments/conda_queue_env_console_equivalent.yaml)을 참조하세요. [deadline-cloud-samples](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline) 

conda 채널에서 사용할 수 없는 애플리케이션을 사용하려는 경우 Amazon S3에서 conda 채널을 생성한 다음 해당 애플리케이션에 대한 자체 패키지를 빌드할 수 있습니다. 자세한 내용은 [S3를 사용하여 conda 채널 생성](configure-jobs-s3-channel.md) 섹션을 참조하세요.

### conda-forge에서 오픈 소스 라이브러리 가져오기
<a name="get-application-csv-example"></a>

이 섹션에서는 `conda-forge` 채널에서 오픈 소스 라이브러리를 사용하는 방법을 설명합니다. 다음 예제는 `polars` Python 패키지를 사용하는 작업 템플릿입니다.

작업은 Deadline Cloud에 패키지를 가져올 위치를 알려주는 대기열 환경에 정의된 `CondaPackages` 및 `CondaChannels` 파라미터를 설정합니다.

파라미터를 설정하는 작업 템플릿의 섹션은 다음과 같습니다.

```
- 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 리포지토리에서 [conda\$1queue\$1env\$1console\$1equivalent.yaml](https://github.com/aws-deadline/deadline-cloud-samples/blob/mainline/queue_environments/conda_queue_env_console_equivalent.yaml)을 참조하세요. [deadline-cloud-samples](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline) 

### 기한 클라우드 채널Blender에서 가져오기
<a name="get-application-blender"></a>

다음 예제는 `deadline-cloud` conda 채널Blender에서 가져오는 작업 템플릿을 보여줍니다. 이 채널은 Deadline Cloud가 디지털 콘텐츠 생성 소프트웨어에 제공하는 제출자를 지원하지만, 동일한 채널을 사용하여 자체 용도로 소프트웨어를 로드할 수 있습니다.

`deadline-cloud` 채널에서 제공하는 소프트웨어 목록은 *AWS Deadline 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.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>

Deadline Cloud의 기본 패키지 관리자는 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.