繁体   English   中英

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并查看您的命令是否已注册。

如果你已经注册了你的命令,你应该在可用的 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 运行(在这种情况下是美国/波哥大)

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

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

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

注意:这不是这个问题的答案,而是任何使用php artisan schedule:run调试的人的线索。 希望它可以为某人节省几分钟的头痛。

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

<?php
...

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

这样做的原因是,您可能将任务安排在某个时间运行,如果该时间尚未到期,它将输出:“没有准备好运行的计划命令。”

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

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

我发现此代码不会将您的工作设置为每 5 分钟运行一次。 如果命令在不到 5 分钟前运行,它也不会阻止命令再次运行。

更好的思考方式是,这段代码将命名命令设置为“每次当前时间的分钟数字为05时都可运行” 换句话说,如果我运行命令行参数: php artisan schedule:run at 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

我最终在我的日志文件中输出。

当我的everyFiveMinutes()计划每 10 分钟在我的文件中创建一个日志时,我发现了上述情况,因为我的任务计划程序每 2 分钟运行一次。

但是,这并不能完全解决您的问题,因为daily()计划 ( 0 0 * * * ) 与您的 cron-job 计划一致。 我唯一能想象的是,正如@Octavio Herrera 所建议的那样,您的时区存在某种错位。 但是,如果不了解更多有关您的环境的信息,就很难说。

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

我认为我的博客将帮助您回答您的问题。 请参阅以下或链接: Laravel Crontab在许多项目中,您需要使用 crontab(cron 作业)来执行一些任务,例如发送电子邮件或删除 DB 中的垃圾记录。 使用 Laravel 项目,您可以更轻松地做到这一点。

在 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

User Active 上面的输出意味着您成功注册了一个命令。

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

crontab -e

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

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

就这样。 感谢您花时间阅读本文。

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

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

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

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

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

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

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

完毕 !!

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

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

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

所以在你的日程表中而不是写作

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

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

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

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

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

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

或者

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

尝试

php 工匠缓存:清除

然后再次运行调度程序

php 工匠时间表:运行

我也遇到了同样的问题,它解决了我的问题。

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

问题在于文件夹存储的权限。

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

之后,cron 开始正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM