2

2 つのコマンドを実行するために、1 分ごとに 1 回実行するようにスケジューラを構成しました。

$schedule->command('amazon:read-sqs')
    ->everyMinute()
    ->runInBackground()
    ->withoutOverlapping()
    ->sendOutputTo(storage_path('logs/cmd/amazon_read_sqs.log'), true)
    ->thenPing('http://beats.envoyer.io/heartbeat/SoMeRaNdOmHaSh1');

$schedule->command('jobs:dispatcher', ['--max' => 100])
    ->everyMinute()
    ->runInBackground()
    ->withoutOverlapping()
    ->sendOutputTo(storage_path('logs/cmd/jobs_dispatcher.log'), true)
    ->thenPing('http://beats.envoyer.io/heartbeat/SoMeRaNdOmHaSh2');

過去 1 か月の開発期間中、順調に稼働しています。しかし、Envoyer で実行するようにサーバーをセットアップした直後に、スケジューラーが突然、最初の 1 回目以降実行されなくなりました。

つまり、Forge でスケジュールが 1 分ごとに設定されている場合、スケジュールは 1 回実行され、ログが追加されることはありません。

thenPing()10分ごとに追跡するためにEnvoyerのハートビートを追加しましたが、 Envoyerに通知するメソッドをトリガーしません...最初の実行後でも。

cron エントリを削除して再作成し、強制的に 1 回だけ実行することができます。

独自の cronjob が与えられている場合、これらはすべて正常に実行されます。

ロック ファイルをチェックすると、/storage/framework/schedule-*それらをブロックしている可能性のある削除するファイルが見つかりません。

問題を示す Laravel ログ ファイルには何もありません。

何か案は?

4

1 に答える 1

1

cronjob を からphp /home/forge/default/artisan schedule:runに変更することでこれを解決しましたphp /home/forge/default/current/artisan schedule:run

これにより、Laravel スケジューラーが正しく動作するようになりました。ただし、これらのメソッドは実際には機能thenPingpingBeforeません。

これを修正するには、各コマンドの後に次の行を手動で追加する必要がありました。

 (new Client())->get('http://beats.envoyer.io/heartbeat/SoMeRaNdOmHaSh');

組み込みの ping メソッドが機能しない理由は謎です。理由を知りたいです。

于 2016-09-24T02:53:31.603 に答える