Laravel“没有预定的命令可以运行。”

时间:2015-06-08 02:10:49

标签: php laravel cron laravel-5

我已经设置了以下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命令每晚运行。

谢谢!

13 个答案:

答案 0 :(得分:13)

运行时

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

答案 1 :(得分:7)

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

m.matches()

删除该方法后,我的命令开始运行并被守护程序进程找到。

我认为该方法可能存在错误,但我现在的项目可能会有点重叠,所以很酷。

答案 2 :(得分:6)

您是否尝试过运行命令manuallay?

运行php artisan并查看您的命令是否已注册。

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

如果您没有看到它们,请继续注册您的命令,方法是将其添加到commands中的app/Console/Kernel.php属性。

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

将crontab条目更改为

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

答案 3 :(得分:6)

注意:这不是这个问题的答案,而是任何人手动调试php artisan schedule:run的线索。希望能为人们节省几分钟的头痛。

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

<?php
...

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

原因在于,您可能正在安排任务在特定时间运行,如果该时间尚未到期,则会输出:&#34;没有预定的命令准备好运行。 &#34;

答案 4 :(得分:6)

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();
它将在指定的TIMEZONE(在这种情况下为America / Bogota)的00:00每天运行

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

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

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

答案 5 :(得分:4)

就我所见,上面没有列出这个问题的完整答案。我们假设我们的时间表如下:

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

我发现这段代码并不能让你的工作每隔5分钟运行一次。如果命令运行时间不到5分钟,它也不会阻止命令再次运行。

考虑它的一个更好的方法是,每当当前时间的分钟数为05时,此代码将命名命令“设置为可运行。换句话说,如果我在php artisan schedule:run运行命令行参数:11:04,则响应为:

# No scheduled commands are ready to run.

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

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

我最终得到了我的日志文件中的输出。

根据我的任务调度程序每2分钟运行一次的事实,我的everyFiveMinutes()计划每10分钟在我的文件中创建一个日志时发现了上述内容。

但是,考虑到daily()计划(0 0 * * *)与您的计划作业计划一致,这并不能完全解决您的问题。我唯一可以想象的是@Octavio Herrera建议你的时区出现某种错位。但是,如果不了解您的环境,就很难说。

答案 6 :(得分:1)

我认为我的博客会帮助您回答您的问题。请参阅以下内容或链接:Laravel Crontab 在许多项目中,您需要使用crontab(cron jobs)执行某些任务,如在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

这就是全部。感谢您抽出时间阅读本文。

答案 7 :(得分:1)

我有同样的问题。每个命令均已正确注册,但我总是收到“尚未准备好运行预定命令。” 消息。问题在于网站在我们进行更新和测试时处于“维护模式” php artisan down 命令)。

答案 8 :(得分:0)

在Windows上,我通过将计划任务设置为每分钟运行 来解决此问题(即使我只想每天触发一次命令),否则我总是得到{{1}消息。

答案 9 :(得分:0)

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

这似乎只是唤醒它以某种方式处理更长的时间间隔。我有everyFiveMinutes(),近两个小时以来,我收到了No scheduled commands are ready to run的回复。我只是将其更改为everyMinute(),它开始正确运行。我持续观看了大约10分钟左右,然后将其改回everyFiveMinutes(),一切顺利。

答案 10 :(得分:0)

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

问题出在文件夹存储上。

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

之后,cron开始正常工作。

答案 11 :(得分:0)

要在 本地服务器 上运行Cron命令,请按照以下步骤操作:

  1. 我知道您已经在app / console / Kernel.php中提到了该命令
  2. 现在打开命令行,输入“ crontab -e”
  3. 编辑该文件并提及以下代码(不带引号)以继续运行PHP artisan计划:在后台运行

“ * * * * * cd / path-to-your-project && php artisan schedule:run >> / dev / null 2>&1”

  1. 在命令行中输入“ crontab -l”,它将列出正在运行的crons

完成了!

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

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

答案 12 :(得分:0)

无论出于何种原因,cron都无法识别任务的命名版本。

所以在您的日程安排中而不是写作

$ schedule-> command('command:task');

您应该使用类的路径,例如

$ schedule-> command(\ App \ Console \ Commands \ TASK :: class)

... Laravel Forge上的调度程序也是如此!