schedule:run ― Laravel Scheduler のエントリーポイント
概要
php artisan schedule:run は 「今の時刻に実行すべきタスクを判定し、実行する」 だけを行うコマンドです。
app/Console/Kernel.php(またはroutes/console.php)に定義したスケジュールを読み込みます。- すべてのイベントを走査し、
isDue()がtrueのものだけを実行します。 - 実行はタイムゾーンに依存せず、サーバー時間をそのまま使用します。
ポイント
スケジューラは「コードに全タスクを定義」する方式なので、cron から 1 行だけ呼び出すだけで実装完了です。
実行例
# すぐに実行したい場合
php artisan schedule:run
タスクが 1 分以内に実行予定なら
Starting scheduled task…とFinished scheduled task…が表示されます。
何も実行されない場合は何も表示されません。
cron で自動化
本番環境では「毎分呼び出す cron を 1 行だけ設定」します。
# /etc/crontab などに追加
* * * * * php /full/path/to/artisan schedule:run >> /dev/null 2>&1
>> /dev/null 2>&1で出力を捨てておけば、サーバーログは肥大化しません。- パスはプロジェクトルートからのフルパスを指定してください。
実装場所
スケジュールは主に次の場所で定義します。
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->command('emails:send')
->dailyAt('13:00')
->withoutOverlapping();
}
}
schedule()メソッド内にScheduleオブジェクトを受け取り、任意のタスクを登録します。- ルート
routes/console.phpでも同様にRoute::command()でタスクを追加できます。
よくあるトラブル
| 問題 | 原因 | 対策 |
|---|---|---|
| タスクが頻繁に走る | everyFiveMinutes() など短い間隔を設定している |
必要な頻度に合わせて hourly(), daily() 等に変更 |
| タスクが走らない | cron が schedule:run を呼ばない |
cron の設定を確認し、パスと権限が正しいか確認 |
| タスクが重複して走る | 長時間実行のジョブが完了前に再度走る | ->withoutOverlapping() または ->onOneServer() を使用 |
| エラーログが確認できない | cron で出力を捨てている |
手動実行で php artisan schedule:run --verbose を確認 |
デバッグ手段
- 実行詳細
php artisan schedule:run --verbose
タスクの判定過程と実行結果を出力します。
- タスク一覧
php artisan schedule:list
定義済みタスクと次回実行時刻を確認できます。

