2015-06-08 13 views
13

Ho installato il seguente laravel comandi:Laravel "Nessun comando pianificato è pronto per essere eseguito."

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

Poi, sul mio server, ho creato un job cron per eseguire una volta al giorno (alle 00:00).

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

Il mio lavoro cron è in esecuzione con successo ogni sera, ma i registri semplicemente dire: "Non ci sono comandi pianificati sono pronti a correre"

Cosa sto sbagliando? Mi aspetto che il mio comando daily venga eseguito ogni notte.

Grazie!

risposta

4

Hai provato a eseguire il comando manuallay?

Eseguire php artisan e verificare se i comandi sono stati registrati.

Se sono stati registrati i comandi, è necessario vedere command:daily-reset e command:monthly-reset sotto l'elenco di comandi artistici disponibili.

Se non li vedi, procedi e registra i tuoi comandi aggiungendoli alla proprietà commands disponibile in app/Console/Kernel.php.

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

Change crontab per

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

+0

Sì, ho provato a eseguire entrambi i comandi manualmente e funzionano correttamente. Sono già stati aggiunti alla matrice '$ commands'. Tutte le funzionalità sembrano funzionare come previsto - l'unico problema è che il cron non le sta attivando, semplicemente visualizzando il messaggio mostrato nella mia domanda. Grazie –

+0

Cambia la voce di crontab in '* * * * * php/home/privati ​​/ public_html/staging/current/artisan schedule: run'. – chanafdo

+3

L'ho modificato per funzionare ogni minuto e sembra funzionare. Sembra stupidamente inefficiente dover eseguirlo ogni minuto per realizzare qualcosa una volta al giorno - ma questo è un problema per un altro giorno. Grazie. –

0

penso che il mio blog vi aiuterà a rispondere alla tua domanda. Si prega di consultare il seguente o il collegamento: Laravel Crontab In molti progetti, è necessario utilizzare crontab (cron jobs) per eseguire alcune attività come l'invio di e-mail o eliminare il record di rifiuti in DB. Con Laravel Project, puoi farlo più facilmente.

essere abbastanza forte per lasciarsi andare e la pazienza di aspettare che ciò che si meritano essere abbastanza forte per lasciarsi andare e la pazienza di aspettare che ciò che si meritano

Creare un comando a 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), 
       ); 
     } 

} 

Passaggio successivo, è necessario registrare il comando con Laravel CLI. Così facile, si apre app/avviare file/artisan.php, e aggiungere una riga come di seguito:

Artisan::add(new FirstCommand); 

Si è fatto creando laravel comando. Per eseguire il test, è possibile utilizzare il comando di seguito:

$ php artisan user:active 

utente attivo L'output sopra significa che si registra con successo un comando.

Infine, mettere il comando nella crontab:

crontab -e 

Add riga (comando di marcia ogni 2 minuti):

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

Questo è tutto. Grazie per aver parlato di questo tempo.

+0

Grazie per le informazioni. Molto apprezzato :) –

4

NB: Questa non è una risposta per questa domanda, ma un indizio per chiunque esegua il debug con php artisan schedule:run manualmente. Spero che salvi qualcuno a pochi minuti di mal di testa.

Verificare se l'operazione pianificata può essere eseguita immediatamente. È possibile utilizzare il metodo exec per quello.

<?php 
... 

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

La ragione di questo è che, si potrebbe essere pianificando il compito di eseguire in un determinato momento e se questo tempo non è ancora dovuta, il risultato sarà: "Nessun comandi pianificati sono pronti a correre."

+0

C'è un modo per farlo uscire prima che tutte le attività pianificate siano state fatte? O c'è un modo per testare le voci fatte in Kernel.php funzionerà correttamente prima di distribuirlo in produzione? – sabertooth1990

+0

@ sabertooth1990 Non ho ottenuto la prima parte della domanda: farla uscire. Ma per i test, cerco sempre di clonare il mio ambiente di produzione il più possibile a livello locale - o, se ciò non è possibile, su un ambiente di staging - quindi ho anche un cron che esegue le pianificazioni localmente. –

+0

quando eseguo 'php artisan your: command' da console funziona. ma quando inserisco qualcosa come la pianificazione delle funzioni protette (Schedule $ schedule) { $ schedule-> command ('my: command') -> dailyAt ('13: 40 ') -> withoutOverlapping(); } non viene pianificato e fatto anche se aspetto un'intera giornata. – sabertooth1990

3

I comandi laravel in programma sono basate nel fuso orario che si è configurato nel file 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', 

Quindi, se si crea un comando e registrarlo a correre come un'operazione pianificata con:

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

verrà eseguito ogni giorno alle 00:00 del fuso specificato (in questo caso l'America/Bogota)

La stessa cosa vale se si sPECIF y un tempo per eseguire l'operazione:

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

Questo verrà eseguito alle 02:30 in America/Bogota ora locale.

+2

Sul tuo ultimo bit di codice, credo che non sia incatenato, ma piuttosto un singolo metodo, dailyAt() – Watercayman

5

ho capito che il problema formano me è stato il metodo incatenato

->withoutOverlapping() 

. Una volta rimosso il metodo, i miei comandi sono stati avviati e trovati dal processo demone.

Penso che ci possa essere un bug con il metodo, ma il mio progetto per ora può prendere un po 'di sovrapposizione, quindi è bello.

+0

[Questa risposta] (https://stackoverflow.com/a/39804140/1128918) fornisce un indizio sul perché 'withoutOverlapping' potrebbe non funzionare nel tuo caso. Ho avuto un problema simile ma volevo mantenere il controllo di sovrapposizione in atto. Nel mio caso, un riavvio dell'istanza ha causato il problema. –

+0

Un altro pensiero: non avevo file di programma nella directory 'storage/framework'. Tuttavia, l'esecuzione di 'php artisan cache: clear' ha funzionato. –

3

Quando si esegue

php artisan schedule:run 

nel server, in cui è memorizzato il progetto, si poteva vedere tutti i comandi in esecuzione con l'uscita, cercando in questo modo:

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

ma solo se la l'ora corrente è quella esatta, per la quale è pianificato il comando. In caso contrario, si sta andando a vedere questa uscita:

"No scheduled commands are ready to run." 

Ad esempio, se si pianifica il comando per ogni cinque minuti e si esegue il comando in ore 09:07 si vedrà che non ci sono comandi di linea, ma se lo esegui in 09:10 vedrai il comando in esecuzione.

In questo modo si può semplicemente programmare il vostro comando da eseguire ogni 5 minuti solo per scopi di debug:

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

poi osservare se c'è qualche errore durante l'esecuzione ed eventualmente risolvere il problema.Con me il problema era che non ho installato GuzzleHttp (vergogna), in modo che la correzione è stata solo in esecuzione questo nel terminale:

composer require guzzlehttp/guzzle 
0

La risposta completa a questa domanda non è elencato sopra, per quanto posso vedere . Supponiamo che il nostro programma è il seguente:

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

Quello che ho scoperto è che questo codice non impostare il processo per l'esecuzione ogni 5 minuti. Né impedisce il comando di eseguire nuovamente se è stato eseguito meno di 5 minuti fa.

Un modo migliore per pensare a questo proposito è che questo codice imposta il comando chiamato "essere eseguibile ogni volta al minuto, figura del tempo corrente è 0 o 5". In altre parole, se corro l'argomento della riga di comando: php artisan schedule:run a 11:04, allora la risposta è:

# No scheduled commands are ready to run. 

Ma se eseguire lo stesso comando a 11:00 o 11:05, allora otteniamo:

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

E finisco con l'output nel mio file di registro.

Ho scoperto quanto sopra quando la mia pianificazione everyFiveMinutes() stava creando un registro nel mio file ogni 10 minuti in base al fatto che il mio task-scheduler era in esecuzione ogni 2 minuti.

Tuttavia, questo non risolve il problema, dato che la pianificazione daily() (0 0 * * *) è allineata con la cron pianificazione del lavoro. L'unica cosa che posso immaginare è che c'è una sorta di disallineamento con i tuoi fusi orari, come suggerito da @ Ottavio Herrera. Ma è difficile dirlo senza saperne un po 'di più sul tuo ambiente.

Problemi correlati