在 Linux 实例上运行 Cron 作业 - AWS OpsWorks

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

在 Linux 实例上运行 Cron 作业

重要

这些区域有: AWS OpsWorks Stacks 该服务已于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请联系 AWS Support 团队开启 AWS re: post 或通过 AWS 高级支持

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

尽管您可以通过连接基于 Linux 的单个实例并编辑其crontab条目来手动设置cron作业,但其主要优势是 SSH AWS OpsWorks Stacks 是你可以指示它在整个实例层上运行任务。以下过程描述了如何在 PHP App Server 层的实例上设置cron作业,但您可以对任何层使用相同的方法。

在层的实例上设置 cron 作业
  1. 使用设置作业的 cron 资源实施一个包含配方的说明书。该示例假定配方已命名为 cronjob.rb;实施详细信息如下文所述。有关说明书和配方的更多信息,请参阅说明书和诀窍

  2. 在堆栈上安装说明书。有关更多信息,请参阅 安装自定义说明书

  3. 有 AWS OpsWorks 堆栈通过将配方分配给以下生命周期事件,自动在层的实例上运行配方。有关更多信息,请参阅 自动运行配方

    • 设置-分配cronjob.rb给此事件指示 AWS OpsWorks 堆叠以在所有新实例上运行配方。

    • 部署-分配cronjob.rb给此事件指示 AWS OpsWorks 当您将应用程序部署或重新部署到层时,堆栈用于在所有在线实例上运行配方。

    您也可以使用 Execute Recipes 堆栈命令来在联机实例上手动运行该配方。有关更多信息,请参阅 运行堆栈命令

以下是cronjob.rb示例,它将 cron 作业设置为每周运行一次用户实现的PHP应用程序,该应用程序从服务器收集销售数据并通过邮件发送报告。有关如何使用 cron 资源的更多示例,请参阅 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 资源。时间 AWS OpsWorks Stacks 在实例上运行配方,关联的提供商处理设置任务的细节。

  • job_namecron 作业的用户定义的名称(如 weekly report)。

  • hour/minute/weekday 指定这些命令应在何时运行。本示例在每周六凌晨 1:10 运行这些命令。

  • command 指定要运行的命令。

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

注意

默认情况下,bundle 命令不适用于 cron 作业。原因是 AWS OpsWorks Stacks 在目录中安装捆绑器。/usr/local/bin要将 bundlecron 作业结合使用,您必须将路径 /usr/local/bin 显式添加到 cron 作业。此外,由于 $ PATH 环境变量可能无法在cron作业中扩展,因此最佳做法是在不依赖扩展 $ PATH 变量的情况下,向作业明确添加任何必要的路径信息。以下示例显示了在 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只需在其实例上运行一个自定义配方即可。

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

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