状況
laravelでアプリケーションを作っており、cronで定期的に行うタスクを追加しています。
タスクは下記のように指定していますが、Laravelで設定しているcommandが実行されません。
cron.dで設定しているタスク
rootのcron.dに下記を設定しています。
cron.d
1* * * * * root /opt/lampp/bin/php /home/project/artisan schedule:run >> /dumplog.txt
Laravel側のスケジュール
Console/Kernel.php
php
1<?php 2 3namespace App\Console; 4 5use Illuminate\Console\Scheduling\Schedule; 6use Illuminate\Foundation\Console\Kernel as ConsoleKernel; 7 8class Kernel extends ConsoleKernel 9{ 10 /** 11 * The Artisan commands provided by your application. 12 * 13 * @var array 14 */ 15 protected $commands = [ 16 \App\Console\Commands\Test::class, 17 ]; 18 19 /** 20 * Define the application's command schedule. 21 * 22 * @param \Illuminate\Console\Scheduling\Schedule $schedule 23 * @return void 24 */ 25 protected function schedule(Schedule $schedule) 26 { 27 28 $schedule->command('command:test') 29 ->cron('* * * * * *') 30 ->before(function(){ 31 $monolog = \Log::getMonolog(); 32 $monolog->info('start scedule'); 33 }) 34 ->timezone('Asia/Tokyo') 35 ->after(function(){ 36 $monolog = \Log::getMonolog(); 37 $monolog->info('end scedule'); 38 }); 39 } 40 41 /** 42 * Register the commands for the application. 43 * 44 * @return void 45 */ 46 protected function commands() 47 { 48 $this->load(__DIR__.'/Commands'); 49 50 require base_path('routes/console.php'); 51 } 52} 53
command:testは下記を実行します。
Console/Commands/Test.php
<?php namespace App\Console\Commands; use Illuminate\Console\Command; class Test extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'command:test'; /** * The console command description. * * @var string */ protected $description = 'Command Test'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { $monolog = \Log::getMonolog(); $monolog->info('handle start'); } }
想定される結果
下記のように、storage/logs/laravel.logに追加される。
[2018-06-14 14:30:02] staging.INFO: start scedule [2018-06-14 14:30:02] staging.INFO: handle start [2018-06-14 14:30:02] staging.INFO: end scedule [2018-06-14 14:31:01] staging.INFO: start scedule [2018-06-14 14:31:01] staging.INFO: handle start [2018-06-14 14:31:01] staging.INFO: end scedule
現象
毎分指定しているスケジュールなのですが、指定したcommandが実行できていません。
laravelログ
[2018-06-14 14:30:02] staging.INFO: start scedule [2018-06-14 14:30:02] staging.INFO: end scedule [2018-06-14 14:31:01] staging.INFO: start scedule [2018-06-14 14:31:01] staging.INFO: end scedule
cronログ
取得時間に際がありますが、cronで、スケジュールの実行自体はされています。
Jun 14 12:59:01 ik1-325-22848 CROND[6628]: (root) CMD (/opt/lampp/bin/php /home/project/artisan schedule:run >> /dumplog.txt) Jun 14 13:00:01 ik1-325-22848 CROND[6649]: (root) CMD (/opt/lampp/bin/php /home/project/artisan schedule:run >> /dumplog.txt)
cronで実行したタスクのログ(dumplog.txt)
毎分出力する設定にしていますので、指定したスケジュールで、実行自体はしているのはわかります。
Running scheduled command: '/opt/lampp/bin/php-7.1.14' 'artisan' command:test > '/dev/null' 2>&1 Running scheduled command: '/opt/lampp/bin/php-7.1.14' 'artisan' command:test > '/dev/null' 2>&1 Running scheduled command: '/opt/lampp/bin/php-7.1.14' 'artisan' command:test > '/dev/null' 2>&1
わかっている事
laravelのバージョン
Laravel Framework 5.5.40
環境
OSは、「CentOS release 6.9」です。
phpはxamppに入っているものを使用しています。
cronの状況
cronのlogを見ると、毎分タスクが実行されているようなので、crontabが止まっている訳ではなさそうです。
Laravelのプロジェクトのディレクトリ
projectユーザーのホームディレクトリ配下に展開しています。
projectユーザーのホームディレクトリは、/home/project/です。
試した事
commandで意図的にエラーを起こす
もしかして、Commandにエラーがあってもエラーをログに吐かないのかと思い、意図的に構文エラーをして見ました。
public function handle() { $monolog = \Log::getMonolog() $monolog->info('handle start'); }
その結果、下記のエラーが吐き出されるので、Command自体は実行されています。
sh
1staging.ERROR: Parse error: syntax error, unexpected '$monolog' (T_VARIABLE) {"exception":"[object] (Symfony\Component\Debug\Exception\FatalThrowableError(code: 0): Parse error: syntax error, unexpected '$monolog' (T_VARIABLE) at /home/project/app/Console/Commands/Test.php:41)
storageに書き出す部分のみの問題な気がします。
何故、scheduleのbeforeとafterは良くて、Commandが書き出せないのかわかりませんが…
storageディレクトリ以下のパーミッションを777にする。
laravel.logのパーミッションが元々「-rw-r--r--」で、projectユーザー(作業ユーザー)しかさわれない状態だったので、laravel.logのパーミッションを777にしてみましたが、logsに書き込まれませんでした。

回答1件
あなたの回答
tips
プレビュー