Laravel"没有预定的命令可以运行."

21 php cron laravel laravel-5

我已经设置了以下Laravel命令:

protected function schedule(Schedule $schedule) {
        $schedule->command('command:daily-reset')->daily();
        $schedule->command('command:monthly-reset')->monthly();
}
Run Code Online (Sandbox Code Playgroud)

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

0 0 * * * php /home/privates/public_html/staging/current/artisan schedule:run
Run Code Online (Sandbox Code Playgroud)

我的cron作业每晚都成功运行,但日志只是说:"没有预定的命令可以运行."

我究竟做错了什么?我希望我的daily命令每晚都能运行.

谢谢!

tsv*_*iko 15

当你跑步

php artisan schedule:run
Run Code Online (Sandbox Code Playgroud)

在存储项目的服务器中,您可以看到所有与输出一起运行的命令,如下所示:

"Running scheduled command: '/usr/local/bin/php' 'artisan' cache:update > '/dev/null' 2>&1 &"
Run Code Online (Sandbox Code Playgroud)

但仅当当前时间是确切的一个时,才会为其安排命令.否则你会看到这个输出:

"No scheduled commands are ready to run."
Run Code Online (Sandbox Code Playgroud)

例如,如果您每隔五分钟安排一次命令并在09:07运行命令,您将看到没有预定的命令,但如果您在09:10运行它,您将看到您的命令正在运行.

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

$schedule->command('command:daily-reset')->everyFiveMinutes();
Run Code Online (Sandbox Code Playgroud)

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

composer require guzzlehttp/guzzle
Run Code Online (Sandbox Code Playgroud)


Mos*_*eda 11

我意识到我遇到的问题是

->withoutOverlapping() 
Run Code Online (Sandbox Code Playgroud)

链式方法.删除该方法后,我的命令开始运行并由守护进程找到.

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

  • 还有一个想法:我在`storage/framework`目录中没有日程表文件.但是,运行`php artisan cache:clear`就可以了. (7认同)
  • 这对我来说也是一个问题。默认情况下,“withoutOverlapping”设置的标志将在 24 小时内过期(!)。就我而言,像 `->withoutOverlapping(5)` 这样使用它更有意义,它指出该标志应在 5 分钟内过期。 (5认同)

小智 8

我有同样的问题。每个命令都已正确注册,但我总是收到\xe2\x80\x9cNo Scheduled Commands are Ready to run.\xe2\x80\x9d消息。问题是,当我们进行更新和测试时,网站处于“维护模式”php artisan down命令)。

\n


cha*_*fdo 7

您是否尝试运行命令manuallay?

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

如果你已经注册你的命令,你应该看到command:daily-resetcommand:monthly-reset可用的工匠命令列表下。

如果您没有看到它们,请继续进行操作,然后通过将其添加到中commands可用的属性中来注册命令app/Console/Kernel.php

protected $commands = [
    'App\Console\Commands\YourFirstCommand',
    'App\Console\Commands\YourSecondCommand'
];
Run Code Online (Sandbox Code Playgroud)

将crontab条目更改为

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

  • 我将其更改为每分钟运行一次,它似乎正在运行。似乎每天每分钟必须运行一次以完成某项任务的效率低下,但这又是另一天的问题。谢谢。 (3认同)

Dav*_*tey 6

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

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

<?php
...

protected function schedule (Schedule $schedule) {
    $schedule -> exec("php artisan your:command");
}
Run Code Online (Sandbox Code Playgroud)

原因是,您可能正在安排任务在特定时间运行,如果该时间尚未到期,它将输出:"没有计划的命令准备好运行."

  • 您可以验证运行`artisan schedule:run`的cron是否正在运行吗?使用以下命令列出所有活动的cron:`crontab -l`如果不在列表中-请注意* / path / to / artisan *-将以下行添加到`crontab -e` ** * * * php / path / to / artisan schedule:运行&gt;&gt; / dev / null 2&gt;&1` (2认同)

小智 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',
Run Code Online (Sandbox Code Playgroud)

因此,如果您创建一个命令并将其注册为作为计划任务运行,则:

$schedule->command('command:daily-reset')->daily();
Run Code Online (Sandbox Code Playgroud)

它将每天在指定的TIMEZONE 00:00运行(在这种情况下为America/Bogota)

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

$schedule->command('command:daily-reset')->daily()->at('02:30');
Run Code Online (Sandbox Code Playgroud)

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

  • 在你的最后一点代码中,我认为它不是链接的,而是一个单独的方法,dailyAt() (2认同)

car*_*rse 5

据我所知,上面没有列出该问题的完整答案。假设我们的时间表如下:

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

我发现此代码不会将您的工作设置为每5分钟运行一次。如果命令运行时间少于5分钟,也不会阻止该命令再次运行。

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

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

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

# No scheduled commands are ready to run.
Run Code Online (Sandbox Code Playgroud)

最后,我在日志文件中输出了结果。

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

但是,鉴于daily()时间表(0 0 * * *)与您的cron-job时间表保持一致,因此这不能完全解决您的问题。我能想象的唯一是,@ Octavio Herrera建议您的时区存在某种偏差。但是,如果不了解您的环境,这很难说。