

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Linux インスタンスでの cron ジョブの実行
<a name="workingcookbook-extend-cron"></a>

**重要**  
この AWS OpsWorks Stacks サービスは 2024 年 5 月 26 日にサポート終了となり、新規および既存のお客様の両方で無効になっています。できるだけ早くワークロードを他のソリューションに移行することを強くお勧めします。移行についてご質問がある場合は、[AWS re:Post](https://repost.aws/) または[AWS プレミアムサポート](https://aws.amazon.com/support)を通じて AWS サポート チームにお問い合わせください。

Linux の cron ジョブは、指定したスケジュールで 1 つ以上のコマンドを実行するよう cron デーモンに指示します。たとえば、スタックで PHP の e コマースアプリケーションをサポートするとします。毎週指定した時刻にサーバーから販売レポートが送信されるように cron ジョブをセットアップできます。cron の詳細については、Wikipedia の「[Cron](http://en.wikipedia.org/wiki/Cron)」を参照してください。Linux ベースのコンピュータまたはインスタンスで直接クローンジョブを実行する方法の詳細については、Indiana University Knowledge Base Web サイトの「[What are cron and crontab, and how do I use them?](https://kb.iu.edu/d/afiz)」を参照してください。

SSH に接続することで個別の Linux ベースのインスタンスで `cron` ジョブを手動でセットアップし `crontab` 項目を編集できますが、 OpsWorks スタックの主なメリットは、インスタンスの全レイヤーを範囲としてタスクを実行できることです。次の手順は、PHP アプリケーションサーバー レイヤーのインスタンスで `cron` ジョブをセットアップする方法を示していますが、どのレイヤーでも同じ方法を使用できます。

**レイヤーのインスタンスで `cron` ジョブをセットアップするには**

1. ジョブをセットアップする `cron` リソースを使用するレシピを含むクックブックを実装します。この例では、レシピ名を `cronjob.rb` としています。実装の詳細については後述します。クックブックとレシピの詳細については、「[クックブックとレシピ](workingcookbook.md)」を参照してください。

1. スタックにクックブックをインストールします。詳細については、「[カスタムクックブックのインストール](workingcookbook-installingcustom-enable.md)」を参照してください。

1. 次のライフサイクルイベントに割り当てて、 OpsWorks スタックでレイヤーのインスタンスでレシピを自動的に実行させます。詳細については、「[レシピを自動的に実行する](workingcookbook-assigningcustom.md)」を参照してください。
   + **セットアップ** – このイベント`cronjob.rb`に割り当てると、すべての新しいインスタンスでレシピを実行するように OpsWorks スタックに指示します。
   + **デプロイ** – このイベント`cronjob.rb`に割り当てると、アプリケーションをレイヤーにデプロイまたは再デプロイするときに、すべてのオンラインインスタンスでレシピを実行するように OpsWorks スタックに指示します。

   `Execute Recipes` スタックコマンドを使用して、オンラインインスタンスでレシピを手動で実行することもできます。詳細については、「[スタックコマンドの実行](workingstacks-commands.md)」を参照してください。

次の `cronjob.rb` の例では、サーバーから販売データを収集して電子メールでレポートを送信する、ユーザーが実装した PHP アプリケーションを週 1 回実行する cron ジョブをセットアップします。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 スタックがインスタンスでレシピを実行すると、関連するプロバイダーがジョブの設定の詳細を処理します。
+ `job_name` は、`cron` ジョブのユーザー定義名 (`weekly report` など) です。
+ `hour`/`minute`/`weekday` では、コマンドをいつ実行するかを指定します。この例では、毎週土曜日の午前 1 時 10 分にコマンドを実行します。
+ `command` では、実行するコマンドを指定します。

  この例では 2 つのコマンドを実行します。まず `/srv/www/myapp/current` ディレクトリに移動します。2 番目のコマンドでは、販売データを収集してレポートを送信する、ユーザーが実装した `mailing.php` アプリケーションを実行します。

**注記**  
デフォルトで、`bundle` コマンドでは `cron` ジョブを操作できません。これは、 OpsWorks スタックが `/usr/local/bin` ディレクトリにバンドルをインストールするためです。`bundle` ジョブで `cron` を使用するには、cron ジョブに明示的にパス `/usr/local/bin` を追加する必要があります。また、\$1PATH 環境変数が `cron` ジョブで展開されない場合があるため、\$1PATH 変数の展開に依存することなく、明示的に必要なパス情報をジョブに追加することがベストプラクティスとなります。以下の例では、`bundle` ジョブで `cron` を使用する方法を 2 種類示しています。  

```
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
```

スタックに複数のアプリケーションサーバーがある場合、PHP アプリケーションサーバーレイヤーのライフサイクルイベントに `cronjob.rb` を割り当てるのは最適な方法とは言えません。たとえば、レイヤーのすべてのインスタンスでレシピが実行されるので、ユーザーには複数のレポートが送信されることになります。この場合、適切な方法は、カスタムレイヤーを使用して 1 つのサーバーだけがレポートを送信できるようにすることです。

**レイヤーの 1 つのインスタンスでのみレシピを実行するには**

1. たとえば、PHPAdmin というカスタムレイヤーを作成し、Setup イベントと Deploy イベントに `cronjob.rb` を割り当てます。カスタムレイヤーでは、必ずしも多くのことを実行する必要はありません。この例では、PHPAdmin はインスタンスでカスタムレシピを 1 つ実行するだけです。

1. PHP アプリケーションサーバー インスタンスの 1 つを AdminLayer に割り当てます。インスタンスが複数のレイヤーに属している場合、 OpsWorks スタックは各レイヤーの組み込みレシピとカスタムレシピを実行します。

PHP アプリケーションサーバーと PHPAdminレイヤーに属しているインスタンスは 1 つだけであるため、`cronjob.rb` はそのインスタンスでのみ実行され、ユーザーは 1 つだけレポートレポートを受け取ります。