PHP
laravel
AmazonLinux

Amazon Linuxでcron設定してLaravelのコマンドを実行するときに色々とハマった

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 に追記する必要があります。

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を設定すると、やっと動きました。