在 Linux 執行個體上執行 Cron 任務 - AWS OpsWorks

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Linux 執行個體上執行 Cron 任務

重要

該 AWS OpsWorks Stacks 服務於 2024 年 5 月 26 日終止使用壽命,並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載移轉至其他解決方案。如果您對移轉有任何疑問,請透過 AWS Re: post 或透過進AWS 階 Support 與 AWS Support 團隊聯絡。

Linux Cron 任務會指示 Cron 協助程式依指定的排程執行一或多個命令。例如,假設您的堆疊支援 PHP 電子商務應用程式。您可以設定 cron 任務,讓伺服器在每週的指定時間將銷售報告傳送給您。如需 cron 的詳細資訊,請參閱 Wikipedia 上的 cron。如需如何直接在 Linux 電腦或執行個體上執行 cron 任務的詳細資訊,請參閱 Indiana University 知識庫網站上的 What are cron and crontab, and how do I use them? (什麼是 cron 和 crontab 以及如何使用它們?)

雖然您可以使用 SSH 連線 cron 任務並編輯其 crontab 項目以在個別 Linux 執行個體上手動設定它們,但是 AWS OpsWorks Stacks 的主要優點是您可以指示它跨整 layer 的執行個體執行任務。下列程序說明如何在 PHP 應用程式伺服器層的執行個體上設定cron工作,但您可以在任何圖層上使用相同的方法。

若要在 layer 執行個體上設定 cron 任務
  1. 實作配方具有已設定任務之 cron 資源的技術指南。此範例假設配方命名為 cronjob.rb;稍後會說明實作詳細資訊。如需技術指南和配方的詳細資訊,請參閱技術指南和配方

  2. 在您的堆疊上安裝技術指南。如需詳細資訊,請參閱 安裝自訂技術指南

  3. 藉由將「 AWS OpsWorks 堆疊」指派給下列生命週期事件,讓「堆疊」自動在圖層的執行個體上執行配方。如需詳細資訊,請參閱 自動執行配方

    • 設定 — 指派cronjob.rb給此事件會指示 AWS OpsWorks Stack 在所有新執行個體上執行方案。

    • 部署 — 指派cronjob.rb給此事件會指示 AWS OpsWorks Stacks 在您將應用程式部署或重新部署到該層時,在所有線上執行個體上執行方案。

    您也可以使用 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 Stack 在執行個體上執行方案時,關聯的提供者會處理設定工作的詳細資料。

  • 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 應用程序服務器層的生命週期事件可能不是一個理想的方法。例如,配方會在 layer 的所有執行個體上執行,因此您會收到多份報告。較佳的方式是使用自訂 layer,確保只有一部伺服器傳送報告。

只在 layer 的其中一個執行個體上執行配方
  1. 建立自訂 layer (例如稱為 PHPAdmin),並將 cronjob.rb 指派給其安裝和部署事件。自訂 layer 不一定需要執行很多操作。在此情況下,PHPAdmin 只會在其執行個體上執行一個自訂配方。

  2. 將其中一個 PHP 應用程式伺服器執行個體指派給 AdminLayer。如果實體屬於多個圖層, AWS OpsWorks 堆疊會執行每個圖層的內建和自訂配方。

因為只有一個實例屬於 PHP 應用程序服務器和 phpAdmin 層,只在該實例上cronjob.rb運行,並且您只收到一個報告。