BETA

AWSのEC2でdockerを使っている環境でLaravelのスケジューラ機能を使う。

投稿日:2020-02-10
最終更新:2020-02-10

Laravelのタスクスケジューラなるものを使ってみたかったので、AWSのEC2のDocker環境で使うようにした方法を書きます。

crontabの記述

マニュアルでは、まず最初にcrontabに下記を記述するよう指示があります。

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1」  

とあります。

Dockerのコンテナからphp artisanコマンドを投げたいわけですが、

* * * * * docker exec phpのコンテナ名 php artisan schedule:run >> cron.log >2&1  

こうしました。最後に改行が必要な点に注意。
解説1: Dockerのexecコマンドを使うことで、コンテナからphp artisan shedule:runを実行します

解説2: Dockerのコンテナからコマンドを実行するのでcdする必要がないと考え、cdコマンドは消しました。
Dockerからの実行ではない場合、php artisanコマンドを認識できるようにLaravelのプロジェクトディレクトリまでcdする必要があると思います。

解説3: マニュアルで記載されている>> /dev/null 2>&1はログを残さないための記述なので、cron.logを書いてログを残すようにしました。
cron.logはとりあえず、ホームディレクトリに作りました。

スケジュール定義

続いて、スケジュール定義ですが、scheduleメソッドのところを

protected function schedule(Schedule $schedule)  
{  
    $schedule->command(‘make:controller HogeHogeContoroller’)->dailyAt(’19:30’);  
}  

こうしました。

19:30にphp aritsan make:controller HogeHogeControllerを実行するというものです。このcommand('')の中で指定するときはphp artisanの部分は書く必要がなく、make:controllerから書きます。
※最初からcrontabでphp artisan make:controller HogeHogeControllerコマンドを打てば良い話ですが、スケジューラを使ってコマンドが実行できるかのテストがしたかったので、スケジューラで実行しています。

これで完成です。

実行結果

19:27から19:30までのcron.logの内容はこんな感じでした。

No scheduled commands are ready to run.  
No scheduled commands are ready to run.  
No scheduled commands are ready to run.  
Running scheduled command: '/usr/local/bin/php' 'artisan' make:controller HogeHogeController > '/dev/null' 2>&1  

app/Http/Controllersにて、lsコマンドを実行してみると、、

-rw-r--r-- 1 ec2-user ec2-user  125  2月 10 19:30 HogeHogeController.php  

ちゃんと19:30にHogeHogeControllerができたみたいです。

おわり

cron自体知らなかったので、いつも通り苦戦しました。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

あろはの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう