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

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

新規登録して質問してみよう
ただいま回答率
85.32%
cron

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

235閲覧

コンテナのcronでスケジュールされたジョブを実行できない

matsu_918

総合スコア2

cron

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

1グッド

0クリップ

投稿2025/03/06 08:40

編集2025/03/09 03:47

実現したいこと

Dockerコンテナ内でcronを入れてコンテナを常時立ち上げ、PHP/Laravelで作成されたジョブを定期実行したいのですが、No scheduled commands are ready to run.となってしまいます。
また、手動実行では問題なく実行できております。
以下確認した内容です。laravel.logや/var/log/cron.logには何も出力がありませんでした。
which phpの結果:/usr/local/bin/php
ps aux | grep cron:稼働していることを確認
php.iniにdisable_functions = proc_openの記載はなし

発生している問題・分からないこと

php artisan schedule:runした結果は以下です。
INFO No scheduled commands are ready to run.

エラーメッセージ

error

1laravel.logやcron.logには何も出力されていません。

該当のソースコード

dockercompose.yml

1version: '3.9' 2 3services: 4 backend: 5 build: 6 context: ./backend 7 container_name: backend-container 8 volumes: 9 - ../src:/var/www/html 10 ports: 11 - "80:80" 12 depends_on: 13 - db 14 15 frontend: 16 build: 17 context: ./frontend 18 container_name: frontend-container 19 working_dir: /var/www/html 20 ports: 21 - "5173:5173" 22 volumes: 23 - ../src:/var/www/html 24 25 batch: 26 build: 27 context: ./batch 28 container_name: batch-container 29 volumes: 30 - ../src:/var/www/html 31 depends_on: 32 - db 33 34 db: 35 image: mysql:latest 36 container_name: db-container 37 ports: 38 - "3306:3306" 39 environment: 40 MYSQL_ROOT_PASSWORD: root 41 MYSQL_DATABASE: laravel 42 MYSQL_USER: laravel 43 MYSQL_PASSWORD: laravel 44 volumes: 45 - db_data:/var/lib/mysql 46 - ./mysql/my.cnf:/etc/mysql/my.cnf 47 48volumes: 49 db_data:

Dockerfile

1FROM php:8.4-cli 2 3RUN apt-get update && apt-get install -y \ 4 cron \ 5 rsyslog \ 6 curl \ 7 zip \ 8 unzip \ 9 git \ 10 libpng-dev \ 11 libonig-dev \ 12 libxml2-dev \ 13 libzip-dev \ 14 nano \ 15 vim \ 16 procps \ 17 && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip 18 19COPY --from=composer:latest /usr/bin/composer /usr/bin/composer 20 21# php.iniをコンテナ内にコピー 22COPY php.ini /usr/local/etc/php/ 23 24# cron ジョブの設定をコピー 25COPY crontab /etc/cron.d/batch-cron 26 27# 設定ファイルの権限を変更 28RUN chmod 0644 /etc/cron.d/batch-cron && \ 29 crontab /etc/cron.d/batch-cron 30 31WORKDIR /var/www/html 32 33# cronのログ出力先を設定(/var/log/cron.log) 34RUN echo "cron.* /var/log/cron.log" > /etc/rsyslog.d/cron-log.conf 35 36# ログファイルがない場合に作成し、適切な権限を設定 37RUN touch /var/log/cron.log && chmod 666 /var/log/cron.log 38 39# cronとrsyslogをバックグラウンドで実行する 40CMD cron && tail -f /var/log/cron.log

SampleJob.php

1<?php 2 3namespace App\Console\Commands; 4 5use Illuminate\Console\Command; 6 7class SampleJob extends Command 8{ 9 /** 10 * The name and signature of the console command. 11 * 12 * @var string 13 */ 14 protected $signature = 'batch:sample'; 15 16 /** 17 * The console command description. 18 * 19 * @var string 20 */ 21 protected $description = 'Command description'; 22 23 /** 24 * Execute the console command. 25 */ 26 public function handle() 27 { 28 \Log::info('Batch job is run!!!'); 29 } 30} 31

Kernel.php

1<?php 2 3namespace App\Console; 4 5use App\Console\Commands\SampleJob; 6use Illuminate\Console\Scheduling\Schedule; 7use Illuminate\Foundation\Console\Kernel as ConsoleKernel; 8 9class Kernel extends ConsoleKernel 10{ 11 /** 12 * Define the application's command schedule. 13 * 14 * @param \Illuminate\Console\Scheduling\Schedule $schedule 15 * @return void 16 */ 17 protected function schedule(Schedule $schedule) 18 { 19 $schedule->command('batch:sample')->everyMinute(); 20 } 21 22 /** 23 * Register the commands for the application. 24 * 25 * @return void 26 */ 27 protected function commands() 28 { 29 $this->load(__DIR__.'/Commands'); 30 31 require base_path('routes/console.php'); 32 } 33} 34

crontab

1* * * * * root cd /var/www/html && php artisan schedule:run >> /var/log/cron.log 2>&1

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果
  1. crontabを以下に修正

crontab

1* * * * * root cd /var/www/html && /usr/local/bin/php artisan schedule:run >> /var/log/cron.log 2>&1

または

crontab

1* * * * * root cd /var/www/html && source /etc/profile && php artisan schedule:run >> /var/log/cron.log 2>&1

上記結果は変わらず、ログ出力もなし

2.権限を変更
chmod 644 /var/log/cron.log及びchmod 777 /var/log/cron.log
上記結果は変わらず、ログ出力もなし

3.cron restartやコンテナ再ビルド
上記結果は変わらず、ログ出力もなし

4.各種php artisan のキャッシュクリア
上記結果は変わらず

補足

PHP:8.4
Laravel:12.1
Docker:28.0.0
Docker Compose:v2.33.0

Eggpan👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hqf00342

2025/03/08 02:01

dockerコンテナ内でcrondは動いているのでしょうか? crondとphp/laravelを1つのコンテナに入れているのでしょうか?dockerfile等も書いたほうが回答がでると思います
matsu_918

2025/03/09 03:53

Dockerfile及びdocker-compose.ymlを追記しました。 cronとphp/laravelは同じコンテナ内です。backendのコンテナが別であり、同じvolumsを使用しています。 service cron statusの結果はcron is running.で動いております。
tezcello

2025/03/09 04:25

> php artisan schedule:runした結果は以下です。 > INFO No scheduled commands are ready to run. そのエラーメッセージで検索すると、「それを実行した『現時点』では実行すべきモノがない」って事だとか、schedule:run ではなく schedule:work で解決したとか、単にキャッシュの問題だとかが見つかるけれど... 質問者さんは、どの様に調べ、何を試し、どの様な結果を得たのでしょうか?
matsu_918

2025/03/09 04:53 編集

全文確認されているでしょうか。 which phpの結果:/usr/local/bin/php ps aux | grep cron:稼働していることを確認 php.iniにdisable_functions = proc_openの記載はなし まずは上記確認し、以下を試しています。 crontab修正 権限変更 cron restartやコンテナ再ビルド 各種php artisan のキャッシュクリア また、手動実行には問題ありません。
tezcello

2025/03/09 05:14

> 全文確認されているでしょうか。 一応読んでいますけどね。 「それ以外の事はやっていますか?」って事なんですが... 当方が検索したなかで見かけた範囲では、 > schedule:run ではなく schedule:work で解決した なんて記述もあったけれど、schedule:run しか試していないみたいだし。 cronで実行させようとすると、:run では上手く機能しない事があるみたいな記述もあったり。
matsu_918

2025/03/09 06:55 編集

schedule:workは永続的に実行するのではないでしょうか? 今回は定期的に実行したいのでschedule:runでの実行を要件とした方がよいかと思っています。
tezcello

2025/03/09 07:06

> schedule:runでの実行を要件とした方がよい 僕自身では Laravelに興味が無く実行できる環境をわざわざ構築するつもりもありませんので、調べた範囲で得られた情報しか持ち合わせていません。 検索結果を読んだ限りでは runでは上手くいかないとありましたが、質問者さんがそれを望むのでしたら僕から提供できる情報はありません。 orz..
matsu_918

2025/03/09 07:21

承知しました。ご協力ありがとうございます。
guest

回答1

0

自己解決

LaravelプロジェクトがKernel.phpを認識していないことが原因でした。
bootstrap/app.phpでKernel.phpを明示的にバインドして返すことで認識させることができ、スケジュール実行も動作しました。
※以下例です。

app.php

1// Console Kernel を手動でバインド 2$app->singleton( 3 Illuminate\Contracts\Console\Kernel::class, 4 App\Console\Kernel::class 5); 6 7return $app;

投稿2025/03/09 08:58

matsu_918

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.32%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問