

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

# 在 Linux 实例上运行 Cron 作业
<a name="workingcookbook-extend-cron"></a>

**重要**  
该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止，新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问，请通过 re [AWS : Post 或通过 Pre](https://repost.aws/) mium Su [AWS pp](https://aws.amazon.com/support) ort 与 AWS 支持 团队联系。

Linux cron 作业指示 cron 守护程序按指定的时间表运行一个或多个命令。例如，假设您的堆栈支持某个 PHP 电子商务应用程序。您可以设置一个 cron 作业来让服务器在每周的指定时间向您发送销售报告。有关 cron 的更多信息，请参阅 Wikipedia 上的 [cron](http://en.wikipedia.org/wiki/Cron)。有关如何直接在基于 Linux 的计算机或实例上运行 cron 任务的更多信息，请参阅印第安纳大学知识库网站上的[什么是 cron 和 crontab 以及如何使用它们？](https://kb.iu.edu/d/afiz)

尽管您可以通过使用 SSH 连接到 `cron` 任务并编辑其 `crontab` 条目来在各个基于 Linux 的实例上手动设置这些任务，但 OpsWorks Stacks 的关键优势在于您可以指示它跨整层的实例运行该任务。以下过程将介绍如何在 PHP App Server 层的实例上设置 `cron` 任务，但您可以对任何层使用同一方法。

**在层的实例上设置 `cron` 作业**

1. 使用设置作业的 `cron` 资源实施一个包含配方的说明书。该示例假定配方已命名为 `cronjob.rb`；实施详细信息如下文所述。有关说明书和配方的更多信息，请参阅[说明书和诀窍](workingcookbook.md)。

1. 在堆栈上安装说明书。有关更多信息，请参阅 [安装自定义说明书](workingcookbook-installingcustom-enable.md)。

1. 通过将配方分配给以下生命周期事件，让 OpsWorks Stacks 在层的实例上自动运行配方。有关更多信息，请参阅 [自动运行配方](workingcookbook-assigningcustom.md)。
   + **设置** — `cronjob.rb` 为该事件分配指示 OpsWorks Stacks 在所有新实例上运行配方。
   + **部署**-分配`cronjob.rb`给此事件会指示 OpsWorks Stacks 在您将应用程序部署或重新部署到该层时在所有在线实例上运行配方。

   您也可以使用 `Execute Recipes` 堆栈命令来在联机实例上手动运行该配方。有关更多信息，请参阅 [运行堆栈命令](workingstacks-commands.md)。

下面是 `cronjob.rb` 示例，该示例设置了一个 cron 作业来每周运行一次用户实施的 PHP 应用程序，该应用程序将从服务器收集销售数据并通过电子邮件发送报告。有关如何使用 cron 资源的更多示例，请参阅 [cron](https://docs.chef.io/chef/resources.html#cron)。

```
cron "job_name" do
  hour "1"
  minute "10"
  weekday "6"
  command "cd /srv/www/myapp/current && php .lib/mailing.php"
end
```

`cron` 是一种表示 `cron` 作业的 Chef 资源。当 OpsWorks Stacks 在实例上运行配方时，相关的提供商会处理设置任务的细节。
+ `job_name` 是 `cron` 作业的用户定义的名称（如 `weekly report`）。
+ `hour`/`minute`/`weekday` 指定这些命令应在何时运行。本示例在每周六凌晨 1:10 运行这些命令。
+ `command` 指定要运行的命令。

  本示例运行两个命令。首先导航到 `/srv/www/myapp/current` 目录。第二个命令运行用户实施的 `mailing.php` 应用程序，该应用程序将收集销售数据并发送报告。

**注意**  
默认情况下，`bundle` 命令不适用于 `cron` 作业。原因是 OpsWorks Stacks 在目录中安装了`/usr/local/bin`捆绑器。要将 `bundle` 与 `cron` 作业结合使用，您必须将路径 `/usr/local/bin` 显式添加到 cron 作业。此外，由于 \$1PATH 环境变量不能在 `cron` 作业中扩展，因此最佳实践是将所有必需的路径信息显式添加到该作业而不依赖于 \$1PATH 变量的扩展。以下示例显示了在 `cron` 中使用 `bundle` 作业的两种方法。  

```
cron "my first task" do
  path "/usr/local/bin"
  minute "*/10"
  command "cd /srv/www/myapp/current && bundle exec my_command"
end
```

```
cron_env = {"PATH" => "/usr/local/bin"}
cron "my second task" do
  environment cron_env
  minute "*/10"
  command "cd /srv/www/myapp/current && /usr/local/bin/bundle exec my_command"
end
```

如果您的堆栈具有多个应用程序服务器，则将 `cronjob.rb` 分配到 PHP App Server 层的生命周期事件可能不是理想方法。例如，配方在层的所有实例上运行，因此您将收到多个报告。更好的方法是使用自定义层来确保只有一台服务器发送报告。

**仅在层的其中一个实例上运行配方**

1. 例如，创建一个名为的自定义层， PHPAdmin 并将其分配`cronjob.rb`给其设置和部署事件。自定义层不一定要执行很多操作。在这种情况下， PHPAdmin 只需在其实例上运行一个自定义配方即可。

1. 将其中一个 PHP 应用服务器实例分配给 AdminLayer。如果一个实例属于多个图层， OpsWorks Stacks 会运行每个层的内置和自定义配方。

由于只有一个实例属于 PHP App Server 和 PHPAdmin 层，因此只能在该实例上`cronjob.rb`运行，并且您只会收到一份报告。