Laravel “No hay comandos programados listos para ejecutarse”.

10 minutos de lectura

He configurado los siguientes comandos de Laravel:

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

Luego, en mi servidor, configuré un trabajo cron para que se ejecute una vez al día (a las 00:00).

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

Mi trabajo cron se ejecuta con éxito todas las noches, pero los registros simplemente dicen: “No hay comandos programados listos para ejecutarse”.

¿Qué estoy haciendo mal? esperaría mi daily comando para ejecutar cada noche.

¡Gracias!

cuando corres

php artisan schedule:run

en el servidor, donde está almacenado su proyecto, podría ver todos sus comandos ejecutándose con salida, luciendo así:

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

pero solo si la hora actual es la exacta para la cual está programado el comando. De lo contrario, verá esta salida:

"No scheduled commands are ready to run."

Por ejemplo, si programa el comando cada cinco minutos y lo ejecuta a las 09:07, verá que no hay comandos programados, pero si lo ejecuta a las 09:10, verá que se está ejecutando.

De esta manera, puede programar su comando para que se ejecute cada 5 minutos solo con fines de depuración:

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

luego observe si hay algún error durante la ejecución y finalmente corríjalo. Por mi parte, el problema fue que no instalé GuzzleHttp (lástima), por lo que la solución fue simplemente ejecutar esto en la terminal:

composer require guzzlehttp/guzzle

  • ¡Gracias por esto! Ejecuto mis scripts cron en Rackspace/LiquidWeb y son notorios por ejecutarse unos minutos tarde. Mi programador estaba configurado para everyTenMinutes() pero debido a que RS estaba ejecutando los scripts dos o tres minutos después de la marca exacta de diez minutos, las tareas del programador no se ejecutarían. Mi solución fue usar everyMinute() ya que ese grado de frecuencia está bien para mí.

    – Soulriser

    21 de marzo de 2018 a las 13:56

  • Esta es la respuesta que estaba buscando. Gracias por explicar esto.

    – Simon Depelchin

    3 de marzo de 2021 a las 8:01

avatar de usuario
Moisés Ndeda

Me di cuenta de que el problema para mí era el siguiente método encadenado:

->withoutOverlapping() 

Una vez que eliminé ese método, mis comandos comenzaron a ejecutarse y el proceso daemon los encontró.

Creo que podría haber un error con el método, pero mi proyecto por ahora puede superponerse un poco, así que está bien.

  • Esta respuesta da una pista de por qué withoutOverlapping no podría estar funcionando en su caso. Tuve un problema similar, pero quería mantener el control de superposición en su lugar. En mi caso, un reinicio de instancia causó el problema.

    – Gustavo Straube

    7 de marzo de 2018 a las 10:57

  • Un pensamiento más: no tenía ningún archivo de programación en storage/framework dirección Sin embargo, correr php artisan cache:clear Hizo el truco.

    – Gustavo Straube

    7 de marzo de 2018 a las 11:06

  • Este fue el problema para mí también. La bandera puesta por withoutOverlapping caduca en 24 horas (!) de forma predeterminada. En mi caso, tenía mucho más sentido usarlo como ->withoutOverlapping(5)que establece que la bandera debe caducar en 5 minutos.

    – AlbinoSequía

    9 mayo 2018 a las 17:05


avatar de usuario
chanafdo

¿Intentaste ejecutar el comando manualmente?

Correr php artisan y vea si sus comandos se han registrado.

Si ha registrado sus comandos, debería ver command:daily-reset y command:monthly-reset en la lista de comandos artesanales disponibles.

Si no los ve allí, continúe y registre sus comandos agregándolos a commands propiedad disponible en app/Console/Kernel.php.

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

Cambiar la entrada de crontab a

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

  • Sí, he intentado ejecutar ambos comandos manualmente y funcionan bien. Ya se agregaron a la $commands formación. Toda la funcionalidad parece estar funcionando como se esperaba: el único problema es que el cron no los activa para que se ejecuten, solo muestra el mensaje que se muestra en mi pregunta. Gracias

    usuario1832945

    8 de junio de 2015 a las 14:59


  • Cambiar la entrada de crontab a * * * * * php /home/privates/public_html/staging/current/artisan schedule:run.

    – chanafdo

    8 de junio de 2015 a las 15:17

  • Lo cambié para que se ejecute cada minuto y parece estar funcionando. Parece estúpidamente ineficiente tener que ejecutarlo cada minuto para lograr algo una vez al día, pero ese es un problema para otro día. Gracias.

    usuario1832945

    14 de junio de 2015 a las 6:14

  • Tengo el mismo problema. Los comandos se ejecutan cada minuto, pero no cada cinco minutos. :/

    – pablorsk

    30 de marzo de 2021 a las 22:29

  • Además de esto, los cronjobs se ejecutan cada minuto. Si no hay nada programado da este mensaje.

    – blakroku

    25 de mayo de 2021 a las 11:09

Los comandos programados de Laravel se basan en la zona horaria que configuró en su archivo 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',

Entonces, si crea un comando y lo registra para ejecutarlo como una tarea programada con:

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

correrá todos los días a las 00:00 DE LA ZONA HORARIA ESPECIFICADA (en este caso América/Bogotá)

Lo mismo se aplica si especifica un tiempo para ejecutar la tarea:

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

Esto se ejecutará a las 02:30 am en hora local de América/Bogotá.

NB: esta no es la respuesta para esta pregunta, sino una pista para cualquiera que esté depurando con php artisan schedule:run a mano. Espero que le ahorre a alguien unos minutos de dolor de cabeza.

Compruebe si la tarea programada puede ejecutarse inmediatamente. Puedes usar el exec método para eso.

<?php
...

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

La razón de esto es que podría estar programando la tarea para que se ejecute en un momento determinado y, si ese momento aún no vence, mostrará: “No hay comandos programados listos para ejecutarse”.

  • ¿Hay alguna manera de hacer que no salga antes de que se completen todas las tareas programadas? ¿O hay alguna forma de probar que las entradas realizadas en Kernel.php se ejecutarán correctamente antes de implementarlas en producción?

    – dientes de sable1990

    26 de octubre de 2016 a las 8:17


  • @ sabertooth1990 No entendí la primera parte de la pregunta: hacer que salga. Pero para las pruebas, siempre trato de clonar mi entorno de producción tanto como sea posible localmente, o si eso no es posible, en un entorno de prueba, por lo que también tengo un cron que ejecuta los horarios localmente.

    – David Lartey

    26 de octubre de 2016 a las 9:49

  • cuando corro php artisan your:command desde consola funciona. pero cuando pongo algo como el programa de funciones protegidas (Programa $ programa) { $ programa -> comando (‘mi: comando’) ->dailyAt(’13:40′) ->sin superposición (); } no se programa ni se hace incluso si espero un día entero.

    – dientes de sable1990

    26 oct 2016 a las 10:24


  • ¿Puedes verificar que el cron que se ejecuta artisan schedule:run ¿Esta corriendo? Enumere todos los crones activos usando: crontab -l si no es parte de la lista – tome nota de la /ruta/al/artesano – agregue la siguiente línea a su crontab -e * * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1

    – David Lartey

    26 oct 2016 a las 10:29


avatar de usuario
carro antes de caballo

La respuesta completa a esta pregunta no figura arriba, por lo que puedo ver. Supongamos que nuestro horario es el siguiente:

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

Lo que descubrí es que este código no configura su trabajo para que se ejecute cada 5 minutos. Tampoco evita que el comando vuelva a ejecutarse si se ejecutó hace menos de 5 minutos.

Una mejor manera de pensarlo es que este código establece el comando nombrado “para ser ejecutable cada vez que la cifra de minutos de la hora actual es 0 o 5. En otras palabras, si ejecuto el argumento de la línea de comandos: php artisan schedule:run a 11:04entonces la respuesta es:

# No scheduled commands are ready to run.

Pero si ejecuto el mismo comando en 11:00 o 11:05entonces obtenemos:

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

Y termino con la salida en mi archivo de registro.

Descubrí lo anterior cuando mi everyFiveMinutes() El programa estaba creando un registro en mi archivo cada 10 minutos basado en el hecho de que mi programador de tareas se ejecutaba cada 2 minutos.

Sin embargo, esto no resuelve del todo su problema, dado que el daily() calendario (0 0 * * *) se alinea con su cronograma de trabajo cron. Lo único que puedo imaginar es que hay algún tipo de desalineación con sus zonas horarias como lo sugiere @Octavio Herrera. Pero eso es difícil de decir sin saber un poco más sobre su entorno.

  • ¿Hay alguna manera de hacer que no salga antes de que se completen todas las tareas programadas? ¿O hay alguna forma de probar que las entradas realizadas en Kernel.php se ejecutarán correctamente antes de implementarlas en producción?

    – dientes de sable1990

    26 de octubre de 2016 a las 8:17


  • @ sabertooth1990 No entendí la primera parte de la pregunta: hacer que salga. Pero para las pruebas, siempre trato de clonar mi entorno de producción tanto como sea posible localmente, o si eso no es posible, en un entorno de prueba, por lo que también tengo un cron que ejecuta los horarios localmente.

    – David Lartey

    26 de octubre de 2016 a las 9:49

  • cuando corro php artisan your:command desde consola funciona. pero cuando pongo algo como el programa de funciones protegidas (Programa $ programa) { $ programa -> comando (‘mi: comando’) ->dailyAt(’13:40′) ->sin superposición (); } no se programa ni se hace incluso si espero un día entero.

    – dientes de sable1990

    26 oct 2016 a las 10:24


  • ¿Puedes verificar que el cron que se ejecuta artisan schedule:run ¿Esta corriendo? Enumere todos los crones activos usando: crontab -l si no es parte de la lista – tome nota de la /ruta/al/artesano – agregue la siguiente línea a su crontab -e * * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1

    – David Lartey

    26 oct 2016 a las 10:29


avatar de usuario
Sebastián

Yo tuve el mismo problema. Cada comando fue registrado correctamente pero siempre recibí el “Ningún comando programado está listo para ejecutarse”. mensaje. El problema era que el sitio web estaba en “modo de mantenimiento” (php artesano abajo comando) mientras hacíamos actualizaciones y pruebas.

  • Sí, esto fue todo para mí también. Bastante tonto que afecte a cron ya que no tiene nada que ver con el nivel http.

    – Gavin Hewitt

    14 abr a las 22:26

  • La solución es sacar la aplicación del modo de mantenimiento ejecutando php artisan up. La salida leerá Application is now live. si la aplicación estaba en modo de mantenimiento, o leerá Application is already up. si el modo de mantenimiento no estaba activo.

    – John Kary

    29 de abril a las 1:28

¿Ha sido útil esta solución?