Laravel“没有计划好的命令可以运行”


Laravel "No scheduled commands are ready to run."

我已经在App'Console'Kernel上设置了以下Laravel命令:

protected function schedule(Schedule $schedule) {
    $schedule->command('command:daily-reset')->daily();
    $schedule->command('command:monthly-reset')->monthly();
}

然后,在我的服务器上,我设置了一个cron作业,每天运行一次(在00:00)。

0 0 * * * php /home/privates/public_html/staging/current/artisan schedule:run

我的cron作业每天晚上都成功运行,但是日志只是显示:"没有预定的命令准备运行。"

我做错了什么?我希望我的daily命令每天晚上运行。

谢谢!

当你运行

php artisan schedule:run

在服务器中(项目存储的地方),您可以看到所有命令正在运行,输出如下所示:

"Running scheduled command: '/usr/local/bin/php' 'artisan' cache:update > '/dev/null' 2>&1 &"

,但仅当当前时间是该命令计划使用的确切时间时。否则,您将看到这样的输出:

"No scheduled commands are ready to run."

例如,如果您每五分钟调度一次命令,并在09:07运行该命令,您将看到没有调度的命令,但是如果您在09:10运行它,您将看到您的命令正在运行。

通过这种方式,您可以将命令安排为每5分钟运行一次,仅用于调试目的:

$schedule->command('command:daily-reset')->everyFiveMinutes();

然后观察运行时是否有任何错误并最终修复它。对我来说,问题是我没有安装GuzzleHttp(羞耻),所以修复只是在终端运行这个:

composer require guzzlehttp/guzzle

我意识到我的问题是下面的链式方法:

->withoutOverlapping() 

一旦我删除了这个方法,我的命令开始运行,并被守护进程发现。

我认为可能有一个错误的方法,但我的项目现在可以采取一点重叠,所以它很酷。

您是否尝试手动运行命令?

运行php artisan,查看命令是否已注册。

如果您已经注册了命令,您应该在可用的工匠命令列表中看到command:daily-resetcommand:monthly-reset

如果你在那里没有看到它们,继续注册你的命令,通过将它添加到app/Console/Kernel.php中可用的commands属性。

protected $commands = [
    'App'Console'Commands'YourFirstCommand',
    'App'Console'Commands'YourSecondCommand'
];

将crontab条目更改为

* * * * * php /home/privates/public_html/staging/current/artisan schedule:run

Laravel调度命令基于您在app/config/app.php文件(Laravel 5.1)中配置的时区:

/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/
'timezone' => 'America/Bogota',

所以如果你创建一个命令并注册它作为一个计划任务运行:

$schedule->command('command:daily-reset')->daily();

它将在指定时区的每天00:00运行(在本例中为America/Bogota)

如果您指定运行任务的时间,则同样适用:

$schedule->command('command:daily-reset')->daily()->at('02:30');

这将在美国/波哥大当地时间凌晨02:30运行。

我也有同样的问题。每个命令都正确注册了,但我总是收到"没有计划的命令准备运行。" 消息。问题是,当我们进行更新和测试时,网站处于"维护模式" (php artisan down命令)。

注意:这不是这个问题的答案,但对于任何手动调试php artisan schedule:run的人来说,这是一个线索。希望这能帮你省下几分钟的头痛。

检查计划任务是否可以立即运行。您可以使用exec方法。

<?php
//...
protected function schedule (Schedule $schedule) {
    $schedule->exec("php artisan your:command");
}

这样做的原因是,您可能将任务安排在某个时间运行,如果该时间尚未到期,它将输出:

No scheduled commands are ready to run.

据我所知,上面没有列出这个问题的完整答案。让我们假设我们的日程安排如下:

protected function schedule(Schedule $schedule)
{
    $schedule
        -> command('cbh:dummyCommand')
        -> everyFiveMinutes()
        -> appendOutputTo ('/my/logs/laravel_output.log');
}

我发现这段代码并没有设置你的作业每5分钟运行一次。如果命令运行时间少于5分钟,它也不会阻止命令再次运行。

一种更好的思考方式是,这段代码将命名命令"设置为每次当前时间的分钟数为05时都可运行"。换句话说,如果我在11:04上运行命令行参数:php artisan schedule:run,那么响应是:

# No scheduled commands are ready to run.

但是如果我在11:0011:05上运行相同的命令,那么我们得到:

# Running scheduled command: php artisan cbh:dummyCommand >> /my/logs/laravel_output.log 2>&1

最后在日志文件中输出。

当我的everyFiveMinutes()计划每10分钟在我的文件中创建一个日志时,我发现了上面的问题,这是基于我的任务计划程序每2分钟运行一次的事实。

然而,这并不能完全解决您的问题,因为daily()调度(0 0 * * *)与您的非作业调度保持一致。我唯一能想到的是,正如@Octavio Herrera所建议的那样,你们的时区有些不一致。但是,如果不了解您的环境,这很难说。

我想我的博客会帮助你回答你的问题。请看下面的链接:Laravel Crontab在许多项目中,您需要使用crontab (cron job)来执行一些任务,例如发送电子邮件或删除DB中的废弃记录。使用Laravel Project,你可以更容易地做到这一点。

在Laravel 4中创建一个命令:

<?php
 
use Illuminate'Console'Command;
use Symfony'Component'Console'Input'InputOption;
use Symfony'Component'Console'Input'InputArgument;
 
class FirstCommand extends Command {
 
        /**
         * The console command name.
         *
         * @var string
         */
        protected $name = 'user:active';
 
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'Command description.';
 
        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
                parent::__construct();
        }
 
        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function fire()
        {
                echo "User Actived";
        }
        /**
         * Get the console command arguments.
         *
         * @return array
         */
        protected function getArguments()
        {
                return array(
                );
        }
 
        /**
         * Get the console command options.
         *
         * @return array
         */
        protected function getOptions()
        {
                return array(
                        array('example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null),
                );
        }
 
}

下一步,您需要在Laravel CLI中注册该命令。很简单,打开app/start/artisan.php文件,添加一行如下:

Artisan::add(new FirstCommand);

您已经完成创建Laravel命令。要进行测试,您可以使用下面的命令:

$ php artisan user:active

用户活跃上面的输出说明您成功注册了一个命令。

最后,将您的命令放入crontab:

crontab -e

添加行(每2分钟运行一次命令):

*/2 * * * * php path_to_laravel_project/artisan user:active

。谢谢你抽出时间来读这篇文章。

在Windows上,我通过将计划任务设置为每分钟运行(即使我只想每天触发一次命令)来修复此问题,否则我总是收到No scheduled commands are ready to run.消息。

Try

php artisan cache:clear

,然后使用

再次运行调度程序

我也面临同样的问题,它解决了我的问题。

由于4年后(2019年)我仍然遇到了这个问题,并且不同的解决方法对我有效,我认为值得暗示为我解决的简单步骤,即:首先使用较短的间隔。

这似乎只是唤醒它在某些方面处理更长的间隔。我有everyFiveMinutes(),近2个小时,它得到No scheduled commands are ready to run的响应。我只是将其更改为everyMinute(),它开始正确运行。我一直看了大约10分钟左右,然后把它换回everyFiveMinutes(),一切都很顺利。

我在No scheduled commands are ready to run.这个问题上坚持了一个小时,但很容易解决:

文件夹存储权限出现问题。

所以,我设置了chmod -R 777 storage/*(我不确定这是优雅的方式)。

之后cron开始正常工作。

要在本地服务器上运行Cron命令,请遵循以下步骤:

  1. 我知道你已经提到了app/console/Kernel.php中的命令
  2. 现在打开命令行,输入"crontab -e"
  3. 编辑该文件,并提到下面的代码(没有引号),以保持运行PHP工匠计划:

" ;* * * * * cd/path-to-your-project,,PHP工匠计划:运行>>2/dev/null祝辞,1"

  • 输入"crontab -l"在命令行中,它将列出正在运行的crons
  • 完成! !

    现在,等待cron处理命令。干杯! !

    参考- https://laravel.com/docs/7.x/scheduling#introduction

    不知什么原因,cron不能识别您的任务的命名版本

    所以在你的日程表中不要写

    美元计划→命令("命令:任务");

    应该使用类的路径,比如

    美元计划→命令(' ' ' App '控制台命令的任务::类)

    …这同样适用于Laravel Forge上的调度程序!

    我已经尝试了所有方法,但最后我找到了解决这个问题的方法。在命令中添加时间戳。下面是这个的例子:

         $schedule->call(function(){
             print("HELLO");
         })->dailyAt('21:51')->timezone('Asia/Kolkata');
    

    $schedule->command('tenam:before')
            ->dailyAt('22:28')->timezone('Asia/Kolkata');