はじめに(何が問題か)
以下のようなコマンドがあって、
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->output->writeLn('Hello !!');
return 0;
}
下記のように、スケジュール登録していたとして、
/**
* Define the application's command schedule.
*
* @param Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('app:hello')->everyMinute();
}
artisan schedule:run
しても
$ docker-compose run --rm task-scheduler
Creating task-scheduler_run ... done
Running scheduled command: '/usr/local/bin/php' 'artisan' app:hello >> '/dev/null' 2>&1
Hello !!
は、標準出力されないんですね。
これを解消したという記事になります。
appendOutputTo('/dev/stdout')
は効かない
\Illuminate\Console\Scheduling\Event
にはappendOutputTo
というメソッドがあって、出力先を指定することができます。
指定しないと/dev/null
になってしまいます。
とはいえ、結論として、appendOutputTo('/dev/stdout')
は効きません。
/**
* Define the application's command schedule.
*
* @param Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('app:hello')->appendOutputTo('/dev/stdout')->everyMinute();
}
どうやって解消したか
答えは、stackoverflow
にありました。
Dockerfileにて、
RUN ln -sf /proc/1/fd/1 /var/log/laravel-scheduler.log
とした上で、出力先を/var/log/laravel-scheduler.log
とします。
/**
* Define the application's command schedule.
*
* @param Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('app:hello')->appendOutputTo('/var/log/laravel-scheduler.log')->everyMinute();
}
すると、Hello !!
が標準出力されるようになります。
(Dockerコンテナのリビルドをお忘れなく)
$ docker-compose run --rm task-scheduler
Creating task-scheduler_run ... done
Running scheduled command: '/usr/local/bin/php' 'artisan' app:hello >> '/var/log/laravel-scheduler.log' 2>&1
Hello !!
おわりに
Laravel
に限った話ではないのかもしれませんが、とにかく何も出力されなくて困り果てていたので解決できて良かったです。
同じ状況で困っている方のお役に立てればと思います。
余談
世の中、アドベントカレンダーの季節ですが、普通に記事書いてしまいました 。。
まあ、今後も書きたいときに書いていきます。
ではでは。