web-dev-qa-db-fra.com

Laravel "Aucune commande planifiée n'est prête à être exécutée."

J'ai configuré les commandes Laravel suivantes:

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

Ensuite, sur mon serveur, j'ai configuré un travail cron pour qu'il s'exécute une fois par jour (à 00h00).

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

Mon travail cron s'exécute avec succès chaque nuit, mais les journaux indiquent simplement: "Aucune commande planifiée n'est prête à s'exécuter."

Qu'est-ce que je fais mal? Je m'attendrais à ce que ma commande daily s'exécute chaque nuit.

Merci!

20
user1832945

Avez-vous essayé d'exécuter la commande manuellement?

Courir php artisan et voyez si vos commandes sont enregistrées.

Si vous avez enregistré vos commandes, vous devriez voir command:daily-reset et command:monthly-reset dans la liste des commandes artisanales disponibles.

Si vous ne les voyez pas, allez-y et enregistrez vos commandes en les ajoutant à la propriété commands disponible dans app/Console/Kernel.php.

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

Changer l'entrée crontab en

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

7
chanafdo

Quand tu cours

php artisan schedule:run

sur le serveur, où votre projet est stocké, vous pouvez voir toutes vos commandes s'exécuter avec une sortie, ressemblant à ceci:

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

mais uniquement si l'heure actuelle est exacte, pour laquelle la commande est planifiée. Sinon, vous allez voir cette sortie:

"No scheduled commands are ready to run."

Par exemple, si vous planifiez la commande toutes les cinq minutes et exécutez la commande à 09:07 heures, vous verrez qu'il n'y a pas de commandes planifiées, mais si vous l'exécutez à 09:10, vous verrez votre commande s'exécuter.

De cette façon, vous pouvez simplement planifier l'exécution de votre commande toutes les 5 minutes uniquement à des fins de débogage:

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

puis observez s'il y a une erreur lors de l'exécution et corrigez-la éventuellement. Pour moi, le problème était que je n'ai pas installé GuzzleHttp (dommage), donc le correctif exécutait simplement ceci dans le terminal:

composer require guzzlehttp/guzzle
15
tsveti_iko

J'ai réalisé que le problème pour moi était la méthode enchaînée ci-dessous:

->withoutOverlapping() 

Une fois que j'ai supprimé cette méthode, mes commandes ont commencé à s'exécuter et à être trouvées par le processus démon.

Je pense qu'il pourrait y avoir un bug avec la méthode, mais mon projet pour l'instant peut prendre un peu de chevauchement donc c'est cool.

10
Moses Ndeda

NB: Ce n'est pas une réponse à cette question, mais un indice pour quiconque débogue avec php artisan schedule:run manuellement. J'espère que cela sauve quelqu'un de quelques minutes de maux de tête.

Vérifiez si la tâche planifiée peut s'exécuter immédiatement. Vous pouvez utiliser la méthode exec pour cela.

<?php
...

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

La raison en est que vous pouvez planifier l'exécution de la tâche à un certain moment et si ce délai n'est pas encore arrivé, il affichera: "Aucune commande planifiée n'est prête à s'exécuter."

6
David Lartey

Les commandes Laravel planifiées sont basées sur le fuseau horaire que vous avez configuré dans votre fichier 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',

Donc, si vous créez une commande et l'enregistrez pour l'exécuter en tant que tâche planifiée avec:

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

il fonctionnera tous les jours à 00h00 DE LA FUSEAU HORAIRE SPÉCIFIÉ (dans ce cas Amérique/Bogota)

La même chose s'applique si vous spécifiez une heure d'exécution de la tâche:

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

Celui-ci se déroulera à 02h30, heure locale de America/Bogota.

6
Octavio Herrera

La réponse complète à cette question n'est pas listée ci-dessus pour autant que je puisse voir. Supposons que notre calendrier soit le suivant:

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

Ce que j'ai découvert, c'est que ce code ne configure pas votre travail pour qu'il s'exécute toutes les 5 minutes. Cela n'empêche pas non plus l'exécution de la commande si elle a été exécutée il y a moins de 5 minutes.

Une meilleure façon d'y penser est que ce code définit la commande nommée "à exécuter à chaque fois que le chiffre des minutes de l'heure actuelle est 0 Ou 5" =. En d'autres termes, si j'exécute l'argument de ligne de commande: php artisan schedule:run À 11:04, Alors la réponse est:

# No scheduled commands are ready to run.

Mais si j'exécute la même commande sur 11:00 Ou 11:05, Alors nous obtenons:

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

Et je me retrouve avec une sortie dans mon fichier journal.

J'ai découvert ce qui précède lorsque mon planning everyFiveMinutes() créait un journal dans mon fichier toutes les 10 minutes en se basant sur le fait que mon planificateur de tâches s'exécutait toutes les 2 minutes.

Cependant, cela ne résout pas tout à fait votre problème, étant donné que la planification daily() (0 0 * * *) S'aligne sur votre planification cron-job. La seule chose que je peux imaginer est qu'il y a une sorte de désalignement avec vos fuseaux horaires comme suggéré par @Octavio Herrera. Mais c'est difficile à dire sans en savoir un peu plus sur votre environnement.

5
cartbeforehorse

Je pense que mon blog vous aidera à répondre à votre question. Veuillez consulter le lien ci-dessous ou le lien: Laravel Crontab Dans de nombreux projets, vous devez utiliser crontab (cron jobs) pour exécuter certaines tâches comme l'envoi d'e-mails ou supprimer un enregistrement de déchets dans la base de données. Avec Laravel Project, vous pouvez le faire plus facilement.

Soyez assez fort pour lâcher prise et assez patient pour attendre ce que vous méritez Soyez assez fort pour lâcher prise et assez patient pour attendre ce que vous méritez

Créez une commande dans 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),
                );
        }

}

L'étape suivante, vous devez enregistrer la commande avec Laravel CLI. Si facile, vous ouvrez le fichier app/start/artisan.php et ajoutez une ligne comme ci-dessous:

Artisan::add(new FirstCommand);

Vous avez fini de créer la commande Laravel. Pour tester, vous pouvez utiliser la commande ci-dessous:

$ php artisan user:active

Utilisateur actif La sortie ci-dessus signifie que vous avez réussi à enregistrer une commande.

Enfin, mettez votre commande dans la crontab:

crontab -e

Ajouter une ligne (exécuter la commande toutes les 2 minutes):

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

C'est tout. Merci d'avoir parlé pour lire ceci.

1

Sous Windows, j'ai résolu ce problème en définissant la tâche planifiée pour qu'elle s'exécute toutes les minutes (même si je ne voulais déclencher une commande qu'une fois par jour), sinon j'obtenais toujours le No scheduled commands are ready to run. message.

0
voidstate

J'ai eu le même problème. Chaque commande était correctement enregistrée mais j'ai toujours reçu le message "Aucune commande planifiée n'est prête à être exécutée.". Le problème était que le site Web était en "mode de maintenance" ( php artisan down command) pendant que nous faisions des mises à jour et des tests.

0
Sebastien