Amazon Linuxでcron設定してLaravelのコマンドを実行するときに色々とハマった
2018-01-29Laravel5.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