

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

# 自动下载
<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>

自动下载使用截止时间 CLI 持续下载任务输出。要对这些下载进行身份验证，您需要长期 IAM 证书。截止日期云监控器凭据过期，因此您不能将其用于此目的。

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

**重要**  
请注意以下警告：  
**请勿**使用您账户的根证书访问 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. 选择**创建策略**以创建具有最低所需权限的自定义策略。

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. 使用以下命令确认截止日期 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. 打开[截止日期云样本存储库 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. 如果您没有默认的截止时间配置设置，则可能需要在命令行中提供以下内容。

        ```
        --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 任务条目 **

   添加以下行，每 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 作业安装 **

   保存并退出编辑器后，验证已添加 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 文件 **

   验证 plist 文件的 XML 语法：

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

   如果文件有效，该命令返回 “确定”。

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. 使用现代引导命令加载启动代理：

         ```
         $ 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. **创建批处理文件包装器 **

   使用以下内容创建批处理文件：

   ```
   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. **测试批处理文件 **

   手动测试批处理文件：

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

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

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

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

   确保 Task Scheduler 服务正在运行：

   ```
   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>
+ 确保调度器服务用户有：
  + Read/write 访问检查点目录
  + 对输出目标目录的写入权限
+ 对于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
   ```

------