没有计划的命令可以运行。仅在$ schedule中

时间:2019-02-11 10:56:02

标签: laravel laravel-5 laravel-5.7

  • Laravel版本:5.7.25
  • PHP版本:7.2.14
  • 数据库驱动程序和版本:MySQL2ªgen。 5.7
  

嗨,抱歉,我在创建计划命令时遇到了这个问题。

说明:

在我们的crontab -e用户中,我们在Debian上插入了以下内容:

* * * * * cd /var/www/myfolder.com/ && php artisan schedule:run >> crontab.laravel

我们已经正确输入了计划功能,如下所示:

app / console / kernel.php

  <?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;


class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
//        'App\Console\Commands\HelpCenter',
        Commands\HelpCenter::class
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('elena:help')->everyMinute();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__ . '/Commands');

        require base_path('routes/console.php');
    }

}

但是结果仍然是没有计划的命令可以运行 我们尝试了所有不可能的组合,但一无所获。 如果我们取消对Artisan调用的功能的注释,则脚本将被执行

  

尝试强制执行命令crontab -e

为了更好地了解问题出在哪里,我们直接在命令中添加了crontab,而没有按如下时间表进行操作:

* * * * * cd /var/www/myfolder.com/ && php artisan elena:help >> crontab.laravel

此命令每分钟运行一次,因此我们无法确定问题出在哪里。 如果您有耐心给我们一些建议,我们将很高兴。美好的一天

1 个答案:

答案 0 :(得分:2)

我将其复制到此处,因为这解决了我的问题。这是上面的@piscator评论。

“您是否运行过php artisan cache:clear?在存储/框架文件夹中可能缓存了一个计划文件。”

编辑:

这个问题给我带来很多麻烦。我正在使用Laravel 5.8,但无法与->withoutOverlapping()配合使用;任务将在没有明显原因的情况下死掉,然后cron作业无法再次启动它,因为->withoutOverlapping()阻止了它。

最后,我找到了解决方法here

基本上,您无需检查Laravel的->withoutOverlapping(),而是可以检查任务是否已在运行。

// start the queue worker, if its not running
$command = "queue:work --queue=high,email,default,low --tries=3 --delay=3";
if (!$this->osProcessIsRunning($command)) {
    $schedule->command($command)->everyMinute()
                                ->runInBackground()
                                ->appendOutputTo(storage_path('logs/queue.log'));
}

// function for checking if the task is running
protected function osProcessIsRunning($needle)
{
    // get process status. the "-ww"-option is important to get the full output!
    exec('ps aux -ww', $process_status);

    // search $needle in process status
    $result = array_filter($process_status, function($var) use ($needle) {
        return strpos($var, $needle);
    });

    // if the result is not empty, the needle exists in running processes
    if (!empty($result)) {
        return true;
    }
    return false;
}

感谢@henryonsoftware提供解决方案