Laravelのスケジュールタスクが動かない
以下のようなcron.d
の設定を用意し、Windows10からElastic Beanstalk環境にデプロイしたところ正常に動かなかった。
.ebextensions/crontab/laravel-schedule.txt
* * * * * root /usr/bin/php /var/www/html/artisan schedule:run > /dev/null 2>&1
cron.d
配下のファイルは末尾に改行を入れないと正常に動かないが、laravel-schedule.txt
の末尾には改行を入れていたのでそこは問題なかった。
.ebextensions/1-crontab.config
container_commands:
01_laravel_cron_job:
command: "cat .ebextensions/crontab/laravel-schedule.txt > /etc/cron.d/laravel-schedule && chmod 644 /etc/cron.d/laravel-schedule"
leader_only: true
/var/log/cron
でログを確認したところ、走らせるコマンドの末尾に^M
が付いていた。これはCR(キャリッジリターン)。これのせいでコマンド自体が走らず失敗していたようだ。
core.autocrlf=true なのに何故?
core.autocrlf=true
の設定をしていれば、gitでプッシュする際に改行コードはLFへ自動変換される。ただ、今回のケースではCRが残っていた。未だに原因がよく分からないけど、「たまに改行コードが ^M
(CRのみ)」になるらしい。そんなんアリか…
対策
.gitattributes
でtxtファイルを強制的にLFの正規化にかけた。
.gitattributes
# text : テキスト属性をtrueにする(改行コード変換の対象とする)
# eol=lf : 改行コードをLFに正規化してチェックイン(プッシュする)
*.txt text eol=lf
あと気をつけたほうが良さそうなことの引用↓
eol=lfが「改行コードをLFに正規化してチェックインする」と明言しているのに対し、eol=crlfは「改行コードを正規化してチェックインする」としか言っていない。あくまでも「チェックアウト時にCRLFに変換する」機能なので、リポジトリにCRLFで格納することを強制する用途で使うことはできない。
.gitattributesのeol=crlfは改行コードをCRLFに変換してチェックインするものではない | standards for me
おわりに
こんなんで3時間もハマってしまったので私にWindowsは早すぎたようです。