質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.84%

  • CentOS

    2486questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • Laravel 5

    1615questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • cron

    157questions

    cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

Laravelのスケジュールに設定したCommandが実行されない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 139

pip

score 10

 状況

laravelでアプリケーションを作っており、cronで定期的に行うタスクを追加しています。 
タスクは下記のように指定していますが、Laravelで設定しているcommandが実行されません。

 cron.dで設定しているタスク

rootのcron.dに下記を設定しています。

* * * * * root /opt/lampp/bin/php /home/project/artisan schedule:run >> /dumplog.txt

 Laravel側のスケジュール

Console/Kernel.php

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        \App\Console\Commands\Test::class,
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {

        $schedule->command('command:test')
            ->cron('* * * * * *')
            ->before(function(){
                $monolog = \Log::getMonolog();
                $monolog->info('start scedule');
            })
            ->timezone('Asia/Tokyo')
            ->after(function(){
                $monolog = \Log::getMonolog();
                $monolog->info('end scedule');
            });
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

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自体は実行されています。

staging.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に書き込まれませんでした。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • pip

    2018/06/14 18:33

    元々、他のサーバーで稼働していたシステムのソースを流用して作ったシステムで、そのシステムではscheduleの処理が出来ています。流用して別サーバーで運用したところこの現象が起こり始めたので、サーバーの差異も見ているのですがこれといった違いが見当たらず、引き続き調査している次第です。

    キャンセル

  • mix-peach

    2018/06/18 16:09 編集

    あ。コマンドを直に実行すれば動くんでしたね! となると、コマンド実行者の違いが原因かもしれません。schedule:run (before、after含む)は、crontabを設定したアカウント(ログから見るに、root)で動くと思うのですが、そこから呼ばれるcommand:testを動かしているのは、ファイル(プロジェクト?)の所有者かapacheかだと思うので、そこらへんの差が「書き出せるか出せないか」に影響しているのかも?(そうすると、やはりパーミッションの話ですかね? でもログファイルの権限「777」で確認されてるんですよね・・不思議ですね・・) ちなみに、apacheのログとかにも、エラーは出てないですか?

    キャンセル

  • pip

    2018/07/18 15:46

    ご回答ありがとうございます。時間をおいてしまい失礼しました。結局根本的な解決には至らず…サーバーを変えたところ解決できたので案件自体は終わりました。取り急ぎご共有まで

    キャンセル

回答 1

check解決した方法

0

根本的な解決はしませんでしたが、
サーバーを変えて一から作り直したところ解決しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • CentOS

    2486questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • Laravel 5

    1615questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • cron

    157questions

    cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。