

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

# 自动下载
<a name="auto-downloads"></a>

Deadline CLI 提供了一个命令，用于下载队列中自上次运行相同命令以来已完成的所有任务的输出。您可以将其配置为 cron 作业或计划任务以重复运行。此配置可设置连续自动下载输出。

在设置自动下载之前，请按照[作业附件的存储配置文件](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/storage-profile.html)中的步骤配置要上传和下载的资产数据的所有路径。如果作业使用的输出路径不在其存储配置文件中，则自动下载会跳过下载该输出并打印警告消息以汇总未下载的文件。同样，如果提交作业时没有存储配置文件，则自动下载会跳过该作业并打印警告消息。默认情况下，Deadline Cloud 提交者会显示存储配置文件之外的路径的警告消息，以帮助确保配置正确。

## 配置 AWS 凭证
<a name="credentials"></a>

自动下载使用 Deadline CLI 持续下载作业输出。要对这些下载进行身份验证，您需要长期 IAM 证书。Deadline Cloud monitor 凭据过期，因此您无法将其用于此目的。

 请按照以下步骤设置长期证书。

**重要**  
请注意以下警告：  
**请勿**使用您账户的根凭证访问 AWS 资源。这些凭证可提供不受限的账户访问且难以撤销。
**不得**在应用程序文件中按字面输入访问密钥或凭证信息。如果您这样做，则在将项目上传到公共存储库或在其他情况下，会有意外暴露凭证的风险。
**不得**在项目区域中放入包含凭证的文件。
保护您的访问密钥。请不要向未经授权方提供访问密钥，即便是为了帮助[找到您的账户标识符](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-identifiers.html)也不行。通过这样做，您可以授予他人永久访问您的帐户的权限。
请注意，存储在共享凭据文件中的所有 AWS 凭据都以纯文本形式存储。
有关更多详细信息，请参阅[《*AWS 一般参考*》中的管理 AWS 访问密钥的最佳实践。](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#securing_access-keys)

**创建 IAM 用户**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**，然后选择**创建用户**。

1. 为用户命名**deadline-output-downloader**。清除 “为**用户提供访问权限” 复选框 AWS 管理控制台，**然后选择 “**下一步**”。

1. 选择**直接附加策略**。

1. 选择 C **re** ate policy 以创建具有最低所需权限的自定义策略。

1. 在 JSON 编辑器中，指定以下权限：

------
#### [ JSON ]

****  

   ```
   {
                      "Version":"2012-10-17",		 	 	 
                      "Statement": [
                          {
                              "Sid": "DeadlineCloudOutputDownload",
                              "Effect": "Allow",
                              "Action": [
                                  "deadline:AssumeQueueRoleForUser",
                                  "deadline:ListQueueEnvironments",
                                  "deadline:ListSessions",
                                  "deadline:ListSessionActions",
                                  "deadline:SearchJobs",
                                  "deadline:GetJob",
                                  "deadline:GetQueue",
                                  "deadline:GetStorageProfileForQueue"
                              ],
                              "Resource": "*"
                          }
                        ]
                     }
   ```

------

1. 命名策略**DeadlineCloudOutputDownloadPolicy**并选择**创建策略**。

1. 返回用户创建页面，刷新策略列表，选择**DeadlineCloudOutputDownloadPolicy**您刚刚创建的策略，然后选择**下一步**。

1. 查看用户详细信息，然后选择**创建用户**。

**创建访问密钥**

1. 在用户详细信息页面上，选择**安全凭证**选项卡。在**访问密钥**部分，选择**创建访问密钥**。

1. 指明您要将密钥用于 “其他”，然后选择 “**下一步**”，然后选择 “**创建访问密钥**”。

1. 在 “**检索访问密钥**” 页面上，选择 “**显示” 以显示**用户的私有访问密钥的值。您可以复制凭证或下载 .csv 文件。

**存储用户访问密钥**
+ 将用户访问密钥存储在系统的 AWS 凭据文件中：
  + 开启Linux，文件位于 `~/.aws/credentials`
  + 开启Windows，文件位于 `%USERPROFILE\.aws\credentials`

  替换以下密钥：

  ```
  [deadline-downloader]
  aws_access_key_id=ACCESS_KEY_ID
  aws_secret_access_key=SECRET_ACCESS_KEY
  region=YOUR_AWS_REGION
  ```

**重要**  
当您不再需要此 IAM 用户时，我们建议您将其删除，以符合[AWS 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#lock-away-credentials)。我们建议您要求人类用户在访问[AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)时使用临时证书 AWS。

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

在创建用于自动下载的 cron 任务或计划任务之前，请完成以下步骤。

1. 如果你还没有，请安装 [Python](https://www.python.org/)。

1. 通过运行以下命令安装 Deadline CLI

   ```
   python -m pip install deadline
   ```

1. 使用以下命令确认 Deadline CLI 的版本是否为 0.52.1 或更高版本。

   ```
   $ deadline --version
   deadline, version 0.52.1
   ```

## 测试输出下载命令
<a name="test-output-command"></a>

**验证该命令在您的环境中是否有效**

1. 获取通往截止日期的路径

------
#### [ Linux and macOS ]

   ```
   $ which deadline
   ```

------
#### [ Windows ]

   ```
   C:\> where deadline
   ```

------
#### [ PowerShell ]

   ```
   PS C:\> Get-Command deadline
   ```

------

1. 运行 sync-output 命令进行引导。

   ```
     /path/to/deadline queue sync-output \
     --profile deadline-downloader \
     --farm-id YOUR_FARM_ID \
     --queue-id YOUR_QUEUE_ID \
     --storage-profile-id YOUR_PROFILE_ID \
     --checkpoint-dir /path/to/checkpoint/directory \
   ```

1. 只有当您的下载计算机与提交计算机相同时，才需要执行此步骤。将`--storage-profile-id YOUR_PROFILE_ID \`上面的内容替换为`--ignore-storage-profiles`。

1. 提交测试作业。

   1. 从 GitHub下载.zip 文件。

      1. 打开[deadline-cloud-samples GitHub 存储库](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline)。

      1. 选择 “**代码**”，然后从下拉菜单中选择 “**下载 ZIP**”。

      1. 将下载的档案解压缩到本地目录。

   1. 运行

      ```
       cd /path/to/unzipped/deadline-cloud-samples-mainline/job_bundles/job_attachments_devguide_output
      ```

   1. 运行

      ```
      deadline bundle submit .
      ```

      1. 如果您没有默认的 deadline 配置设置，则可能需要在命令行中提供以下内容。

        ```
        --farm-id YOUR-FARM-ID --queue-id YOUR-QUEUE-ID
        ```

   1. 等待任务完成后再进入下一步。

1. 再次运行同步输出命令。

   ```
    /path/to/deadline queue sync-output \
     --profile deadline-downloader \
     --farm-id YOUR_FARM_ID \
     --queue-id YOUR_QUEUE_ID \
     --storage-profile-id YOUR_PROFILE_ID \
     --checkpoint-dir /path/to/checkpoint/directory
   ```

1. 请验证以下内容：
   + 您的测试作业的输出显示在目标目录中。
   + 将在您指定的检查点目录中创建检查点文件。

## 设置预定下载
<a name="set-up-scheduled-downloads"></a>

选择操作系统的选项卡，了解如何配置每 5 分钟自动下载一次。

------
#### [ Linux ]

1. **验证 CLI 安装截止日期**

   获取截止日期可执行文件的确切路径：

   ```
   $ which deadline
   ```

   请注意此路径（例如`/opt/homebrew/bin/deadline`），以便在 plist 文件中使用。

1. **创建检查点目录**

   创建存储检查点文件的目录。确保您的用户拥有适当的权限才能运行该命令。

   ```
   $ mkdir -p /path/to/checkpoint/directory
   ```

1. **创建日志目录**

   为 cron 作业日志创建目录：

   ```
   $ mkdir -p /path/to/logs
   ```

   考虑使用 https://www.redhat.com/en/ blog/setting-logrotate 在日志文件上设置日志轮换

1. **检查当前的 Crontab**

   查看您当前的 crontab 以查看现有作业：

   ```
   $ crontab -l
   ```

1. **编辑 Crontab**

   打开你的 crontab 文件进行编辑：

   ```
   $ crontab -e
   ```

   如果这是您第一次，系统可能会提示您选择编辑器（nano、vim 等）。

1. **添加 Cron Job 条目**

   添加以下行以每 5 分钟运行一次作业（将路径替换为步骤 1 和 2 中的实际值）：

   ```
   */5 * * * * /path/to/deadline queue sync-output --profile deadline-downloader --farm-id YOUR_FARM_ID --queue-id YOUR_QUEUE_ID --storage-profile-id YOUR_PROFILE_ID --checkpoint-dir /path/to/checkpoint/directory >> /path/to/logs/deadline_sync.log 2>&1
   ```

1. **验证 Cron Job 的安装情况**

   保存并退出编辑器后，验证是否添加了 cron 作业：

   ```
   $ crontab -l
   ```

   您应该会看到您的新工作已列出。

1. **检查 Cron 服务状态**

   确保 cron 服务正在运行：

   ```
   # For systemd systems (most modern Linux distributions)
   $ sudo systemctl status cron
   # or
   $ sudo systemctl status crond
   
   # For older systems
   $ sudo service cron status
   ```

   如果未运行，请启动它：

   ```
   $ sudo systemctl start cron
   $ sudo systemctl enable cron  # Enable auto-start on boot
   ```

------
#### [ macOS ]

1. **验证 CLI 安装截止日期**

   获取截止日期可执行文件的确切路径：

   ```
   $ which deadline
   ```

   请注意此路径（例如`/opt/homebrew/bin/deadline`），以便在 plist 文件中使用。

1. **创建检查点目录和日志目录**

   创建存储检查点文件的目录：

   ```
   $ mkdir -p /path/to/checkpoint/directory
   $ mkdir -p /path/to/logs
   ```

   考虑使用 https://formulae.brew 在日志文件上设置日志轮换。 sh/formula/logrotate

1. **创建一个 Plist文件**

   在创建包含以下内容`~/Library/LaunchAgents/com.user.deadlinesync.plist`的配置文件（`/path/to/deadline`替换为步骤 1 中的实际路径）：

   ```
   <?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
   <plist version="1.0">
   <dict>
       <key>Label</key>
       <string>com.user.deadlinesync</string>
       <key>ProgramArguments</key>
       <array>
           <string>/path/to/deadline</string>
           <string>queue</string>
           <string>sync-output</string>
           <string>--profile</string>
           <string>deadline-downloader</string>
           <string>--farm-id</string>
           <string>YOUR_FARM_ID</string>
           <string>--queue-id</string>
           <string>YOUR_QUEUE_ID</string>
           <string>--storage-profile-id</string>
           <string>YOUR STORAGE PROFILE ID</string>
           <string>--checkpoint-dir</string>
           <string>/path/to/checkpoint/dir</string>
       </array>
       <key>RunAtLoad</key>
       <true/>
       <key>UserName</key>
       <string>YOUR_USER_NAME</string>
       <key>StandardOutPath</key>
       <string>/path/to/logs/deadline_sync.log</string>
       <key>StartInterval</key>
       <integer>300</integer>
   </dict>
   </plist>
   ```

   `--ignore-storage-profiles`如果您的下载计算机与提交计算机相同，请将`--storage-profile-id YOUR_PROFILE_ID`上面的内容替换为。

1. **验证列表文件**

   验证 plist 文件的 XML 语法：

   ```
   $ plutil -lint ~/Library/LaunchAgents/com.user.deadlinesync.plist
   ```

   如果文件有效，则应返回 “OK”。

1. **检查现有的启动代理或启动守护程序**

   检查启动代理是否已加载：

   ```
   $ launchctl list | grep deadlinesync
   OR
   $ sudo launchctl list | grep deadlinesync
   ```

   如果存在，请先将其卸载：

   ```
   $ launchctl bootout gui/$(id -u)/com.user.deadlinesync
   OR
   $ sudo launchctl bootout system/com.user.deadlinesync
   ```

1. **创建并引导**

   要在用户登录时运行此任务，请以身份运行**LaunchAgent**。要在每次计算机运行时都没有用户登录的情况下运行此任务，请将其作为运行**LaunchDaemon**。

   1. 要以**LaunchAgent以下方式运行：**

      1. 使用在下创建的配置 `~/Library/LaunchAgents/com.user.deadlinesync.plist`

      1. 然后使用 bootstrap 命令加载配置：

         ```
         $ launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.user.deadlinesync.plist
         ```

   1. 要以**LaunchDaemon**以下方式运行：

      1. 通过运行以下命令移动 Pilst 文件并更改权限：

         ```
         $ sudo mv ~/Library/LaunchAgents/com.user.deadlinesync.plist /Library/LaunchDaemons/ 
         $ sudo chown root:wheel /Library/LaunchDaemons/com.user.deadlinesync.plist 
         $ sudo chmod 644 /Library/LaunchDaemons/com.user.deadlinesync.plist
         ```

      1. 使用新式 bootstrap 命令加载启动代理：

         ```
         $ sudo launchctl bootstrap system /Library/LaunchDaemons/com.user.deadlinesync.plist
         ```

1. **验证状态**

   如果你引导了，请 LaunchAgent 运行以下命令来确认它已加载：

   ```
   $ launchctl list | grep deadlinesync
   ```

   如果你启动了 a LaunchDaemon，请运行以下命令确认它已加载：

   ```
   $ sudo launchctl list | grep deadlinesync
   ```

   输出应如下所示

   ```
   SOME_PID_NUMBER 0 com.user.deadlinesync
   ```

   有关详细状态信息，请执行以下操作：

   ```
   $ launchctl print gui/$(id -u)/com.user.deadlinesync
   ```

   这显示了当前状态、程序参数、环境变量、运行间隔和执行历史记录。

------
#### [ Windows ]

**注意**  
使用这些说明创建的计划任务仅在用户登录时起作用。  
要在系统启动时进行设置，无需用户登录，请参阅官方[Windows文档](https://learn.microsoft.com/en-us/windows/win32/taskschd/using-the-task-scheduler)。

要执行以下所有步骤，请使用命令提示符-以管理员身份运行：

1. **验证 CLI 安装截止日期**

   查找截止日期可执行文件：

   ```
   C:\> where deadline
   ```

   记下任务中使用的完整路径（例如`C:\Program Files\Amazon\DeadlineCloud\deadline.exe`）。

1. **创建检查点目录**

   创建存储检查点文件的目录：

   ```
   C:\> mkdir "path\to\checkpoint\directory"
   ```

1. **创建日志目录**

   为任务日志创建目录：

   ```
   C:\> mkdir "path\to\logs"
   ```

1. **创建 Batch 文件包装器**

   创建包含以下内容的批处理文件：

   ```
   C:\> notepad C:\path\to\deadline_sync.bat
   ```

   ```
   YOUR_PATH_TO_DEADLINE.EXE queue sync-output --profile deadline-downloader --farm-id YOUR_FARM_ID --queue-id YOUR_QUEUE_ID --storage-profile-id YOUR_PROFILE_ID --checkpoint-dir path\to\checkpoint\checkpoints > path\to\logs\deadline.log 2>&1
   ```

1. **Test Batch 文件**

   手动测试批处理文件：

   ```
   C:\> .\path\to\deadline_sync.bat
   ```

   检查日志文件是否已创建：

   ```
   C:\> notepad path\to\logs\deadline_sync.log
   ```

1. **查看任务计划程序服务**

   确保任务计划程序服务正在运行：

   ```
   C:\> sc query "Schedule"
   ```

   如果该服务不存在，请尝试其他名称：

   ```
   C:\> sc query "TaskScheduler"
   C:\> sc query "Task Scheduler"
   ```

   如果未运行，请启动它：

   ```
   C:\> sc start "Schedule"
   ```

1. **创建计划任务**

   创建每隔 5 分钟运行一次的任务。

   ```
   C:\> schtasks /create /tn "DeadlineOutputSync" /tr "C:\path\to\deadline_sync.bat" /sc minute /mo 5
   ```

   命令细分：
   + `/tn`-任务名称
   + `/tr`-要运行的任务（您的批处理文件）
   + `/sc minute /mo 5`-时间表：每 5 分钟一班

1. **验证任务创建**

   检查任务是否已成功创建：

   ```
   schtasks /query /tn "DeadlineOutputSync" /v /fo LIST
   ```

   寻找：
   + 待@@ **运行的任务**：应显示您的批处理文件路径
   + **下次运行时间**：应显示 5 分钟以内的时间

1. **测试任务执行**

   手动运行任务进行测试：

   ```
   schtasks /run /tn "DeadlineOutputSync"
   ```

   检查任务状态：

   ```
   schtasks /query /tn "DeadlineOutputSync"
   ```

------

**验证设置**

要验证自动下载设置是否成功，请完成以下步骤。

1. 提交新的测试作业。

1. 等待一个调度程序间隔完成，在本例中为 5 分钟。

1. 验证是否自动下载了新输出。

如果输出未下载，请查看 “故障排除” 部分以获取过程日志。

## 自动下载疑难解答
<a name="auto-downloads-troubleshooting"></a>

如果您在自动下载时遇到问题，请检查以下内容：

### 存储配置文件问题
<a name="storage-profile-issues"></a>
+ 日志文件`[Errno 13] Permission denied`中出现类似`[Errno 2] No such file or directory`或的错误可能与存储配置文件缺失或配置错误有关。
+ [有关在下载计算机与提交计算机不同时如何设置存储配置文件的信息，请参阅存储配置文件。](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/storage-profile-job-attachments.html)
+ 要在同一台计算机上下载，请尝试使用该`--ignore-storage-profiles`标志。

### 目录权限
<a name="directory-permissions"></a>
+ 确保调度程序服务用户具有：
  + 对检查点目录的读/写权限
  + 对输出目标目录的写入权限
+ 对于Linux和macOS，使用`ls -la`来检查权限。
+ 对于Windows，请查看 “属性” 文件夹中的 “安全设置”。

### 检查日程安排日志
<a name="checking-scheduler-logs"></a>

------
#### [ Linux ]

1. 检查 cron 服务是否正在运行：

   ```
   # For systemd systems
   $ sudo systemctl status cron
   # or
   $ sudo systemctl status crond
   
   # Check if your user has cron job correctly configured
   $ crontab -l
   ```

1. 查看 cron 执行日志：

   ```
   # Check system logs for cron activity (most common locations)
   $ sudo tail -f /var/log/syslog | grep CRON
   $ sudo tail -f /var/log/cron.log | grep deadline
   
   # View recent cron logs
   $ sudo journalctl -u cron -f
   $ sudo journalctl -u crond -f  # On some systems
   ```

1. 查看您的特定 cron 作业日志：

   ```
   # View the log file specified in your cron job
   $ tail -100f /path/to/logs/deadline_sync.log
   ```

1. 在系统日志中搜索 cron 作业执行情况：

   ```
   # Look for your specific cron job executions
   $ sudo grep "deadline.*incremental-output-download" /var/log/syslog
   
   # Check for cron job starts and completions
   $ sudo grep "$(whoami).*CMD.*deadline" /var/log/syslog
   ```

1. 检查检查点文件更新：

   ```
   # List checkpoint files with timestamps
   $ ls -la /path/to/checkpoint/directory/
   
   # Check when checkpoint was last modified
   $ stat /path/to/checkpoint/directory/queue-*_download_checkpoint.json
   ```

1. 检查日志文件：

   ```
   $ ls -la /path/to/log/deadline_sync.log
   ```

------
#### [ macOS ]

查看启动代理执行日志：

1. 检查启动代理是否正在运行：

   ```
   $ sudo launchctl list | grep deadlinesync
   ```

   输出显示：`PID Status Label`（PID 将在当前未运行`-`时显示，这对于间隔作业来说是正常的）

1. 查看详细的启动代理状态：

   ```
   $ sudo launchctl print system/com.user.deadlinesync
   ```

   这显示了执行历史记录、上次退出代码、运行次数和当前状态。

1. 查看启动代理执行日志：

   ```
   # View recent logs (last hour)
   log show --predicate 'subsystem contains "com.user.deadlinesync"' --last 1h
   
   # View logs from a specific time period
   log show --predicate 'subsystem contains "com.user.deadlinesync"' --start '2024-08-27 09:00:00'
   ```

1. 强制运行启动代理以立即进行测试：

   ```
   $ sudo launchctl kickstart gui/$(id -u)/com.user.deadlinesync
   ```

   无论日程安排如何，这都会立即触发作业，这对于测试很有用。

1. 检查检查点文件更新：

   ```
   # List checkpoint files with timestamps
   $ ls -la /path/to/checkpoint/directory/
   ```

1. 检查日志文件：

   ```
   $ ls -la /path/to/log/deadline_sync.log
   ```

------
#### [ Windows ]

1. 检查任务计划程序服务是否正在运行：

   ```
   C:\> sc query "Schedule"
   ```

   如果该服务不存在，请尝试其他名称：

   ```
   C:\> sc query "TaskScheduler"
   C:\> sc query "Task Scheduler"
   ```

1. 查看您的计划任务：

   ```
   C:> schtasks /query /tn "DeadlineOutputSync"
   ```

1. 检查任务的日志文件：

   ```
   # View the log file created by your batch script
   C:> notepad C:\path\to\logs\deadline_sync.log
   ```

1. 检查检查点文件更新：

   ```
   # List checkpoint files with timestamps
   C:> dir "C:\path\to\checkpoint\directory" /od
   ```

------