Laravel5.1で作ったアプリケーションをAmazonLinux上で動かしていて、cronでバッチ処理の設定をしたいと思いました。
が、すこし詰まる部分があったのでそのときのメモです。

Laravelでコマンドを作成するにはターミナルで下記コマンドを実行します。

$ php artisan make:console hoge_batch --command="hoge_batch"
Console command created successfully.

コマンド実行クラスが生成されるので、そこに処理を記述します。
実行する時は下記で実行できます。

$ php artisan hoge_batch


  [InvalidArgumentException]
  Command "hoge_batch" is not defined.

ここで 最初の罠 です。この段階では動きません。
app/Console/Commands/Kernel.php に追記する必要があります。

<?php
protected $commands = [
    Commands\hoge_batch::class,
];

じゃあこれをAmazonLinux上でcron設定して実行させます。
まずは date コマンドでサーバのタイムゾーンがJSTになっているか確認です。これがJSTになっていないと、いつまでたっても実行されない、なんてことになります。

$ date 
Tue Dec 26 12:30:33 JST 2017

cronの設定です。とりあえずテストもかねて数分後を設定します。

$ crontab -e

35 12 * * * php artisan /var/www/path/to/app/artisan hoge_batch

…実行されません。タイムゾーンはしっかりしているのに。

ここで 2つ目の罠 。 サーバのタイムゾーン設定を変更した時は、 crond を再起動する必要があります。
おそらくインスタンス起動後にタイムゾーンなど諸々設定はしたものの、crond を再起動していなかったようです。

$ sudo service crond restart

再び実行してみると、コマンド自体は実行されているものの、実行途中で止まっている?ようです。
crontab -l でcron設定を見直してみると、/var/spool/mail/ec2-user にメールが来てるよ、というメッセージが出ていました。

$ tail /var/spool/mail/ec2-user
#6  in /var/www/path/to/app/bootstrap/cache/compiled.php on line 13440
PHP Fatal error:  Uncaught UnexpectedValueException: The stream or file "/var/www/path/to/app/storage/logs/laravel-2017-12-26.log" could not be opened: failed to open stream: Permission denied in /var/www/path/to/app/bootstrap/cache/compiled.php:13440

これが 最後の罠 。 どうやらログファイルに書き込み権限が無いようです。

cronをapacheユーザで実行するように設定します。
とりあえず crontab -e でもともとの設定は削除しておきます。消さないとエラーが出続けます。

$ sudo -u apache -e

これで再度cronを設定すると、やっと動きました。

comments powered by Disqus