本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Linux 实例上运行 Cron 作业
重要
这些区域有: AWS OpsWorks Stacks 该服务已于 2024 年 5 月 26 日终止,新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问,请联系 AWS Support 团队开启 AWS re: post 或通过
Linux cron 作业指示 cron 守护程序按指定的时间表运行一个或多个命令。例如,假设您的堆栈支持PHP电子商务应用程序。您可以设置一个 cron 作业来让服务器在每周的指定时间向您发送销售报告。有关 cron 的更多信息,请参阅 Wikipedia 上的 cron
尽管您可以通过连接基于 Linux 的单个实例并编辑其crontab
条目来手动设置cron
作业,但其主要优势是 SSH AWS OpsWorks Stacks 是你可以指示它在整个实例层上运行任务。以下过程描述了如何在 PHP App Server 层的实例上设置cron
作业,但您可以对任何层使用相同的方法。
在层的实例上设置 cron
作业
-
使用设置作业的
cron
资源实施一个包含配方的说明书。该示例假定配方已命名为cronjob.rb
;实施详细信息如下文所述。有关说明书和配方的更多信息,请参阅说明书和诀窍。 -
在堆栈上安装说明书。有关更多信息,请参阅 安装自定义说明书。
-
有 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_name
cron
作业的用户定义的名称(如weekly report
)。 -
hour
/minute
/weekday
指定这些命令应在何时运行。本示例在每周六凌晨 1:10 运行这些命令。 -
command
指定要运行的命令。本示例运行两个命令。首先导航到
/srv/www/myapp/current
目录。第二个命令运行用户实施的mailing.php
应用程序,该应用程序将收集销售数据并发送报告。
注意
默认情况下,bundle
命令不适用于 cron
作业。原因是 AWS OpsWorks Stacks 在目录中安装捆绑器。/usr/local/bin
要将 bundle
与 cron
作业结合使用,您必须将路径 /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 层的生命周期事件可能不是理想的方法。例如,配方在层的所有实例上运行,因此您将收到多个报告。更好的方法是使用自定义层来确保只有一台服务器发送报告。
仅在层的其中一个实例上运行配方
-
例如,创建一个名为的自定义层,PHPAdmin并将其分配
cronjob.rb
给其设置和部署事件。自定义层不一定要执行很多操作。在这种情况下,PHPAdmin只需在其实例上运行一个自定义配方即可。 -
将其中一个PHP应用服务器实例分配给 AdminLayer。如果一个实例属于多个层, AWS OpsWorks Stacks 运行每个图层的内置和自定义配方。
由于只有一个实例属于 PHP App Server 和PHPAdmin图层,因此只能在该实例上cronjob.rb
运行,并且您只会收到一份报告。