2016-10-19 7 views
1

Ich habe Probleme mit Laravels Konsolenbefehlen. Mein Problem ist, dass die Funktion handle() nicht automatisch aufgerufen wird, wenn ich meine geplanten Jobs im Konsolenkernel mit systemd (statt crontab) ausführe.Handle() - Funktion im Konsolenbefehl wird nicht aufgerufen

Lassen Sie mich versuchen und zu klären, weiter, was los ist:

  • Der Griff() Funktion automatisch aufgerufen wird, wenn ‚php Handwerker meinen: Befehl‘ Aufruf von der Konsole
  • Der Griff() Funktion ist wird automatisch aufgerufen, wenn meine geplanten Jobs durch den Aufruf von artisan in der cttab ausgeführt werden.
  • Die Funktion handle() wird nicht automatisch aufgerufen, wenn meine geplanten Jobs ausgeführt werden, indem ich artisan als SYSTEMD-Task aufruft. Der Hauptunterschied hier ist, dass handle() aufgerufen wird, wenn Sie crontab verwenden, aber nicht, wenn Sie systemd verwenden.

Hat jemand mit Wissen über Systemd Scheduling eine Idee, warum das ist? Ich kann aus dem Systemjournal sehen, dass meine Befehle vom Systemd-Dienst aufgerufen werden, die Funktion handle() wird jedoch nie aufgerufen.

Sie könnten sagen, warum nicht Crontab verwenden? Dies ist jedoch kein Ansatz, den ich nachvollziehen kann und sehe keinen Grund, warum es sowieso nicht funktionieren sollte. Hilfe wäre willkommen!

Das ist mein systemd artisan.service:

[Unit] 
Description=Artisan service 
After=network.target 

[Service] 
Type=simple 
Environment=TLNN=/opt/tlnn 
ExecStart=/usr/bin/php /srv/www/tlnn/artisan schedule:run 

[Install] 
WantedBy=multi-user.target 

Kernel.php:

namespace App\Console; 
use Illuminate\Console\Scheduling\Schedule; 
use Illuminate\Foundation\Console\Kernel as ConsoleKernel; 
use App\Classes\InfoCommunications; 
class Kernel extends ConsoleKernel 
{ 
    /** 
    * The Artisan commands provided by your application. 
    * 
    * @var array 
    */ 
    protected $commands = [ 
     \App\Console\Commands\SendData::class, 
     \App\Console\Commands\RefreshData::class, 
    ]; 
    /** 
    * Define the application's command schedule. 
    * 
    * @param \Illuminate\Console\Scheduling\Schedule $schedule 
    * @return void 
    */ 
    protected function schedule(Schedule $schedule) 
    { 
     $schedule->command('TLNN:SendData')->cron('*/1 * * * *'); 
     $schedule->call('TLNN:RefreshData')->twiceDaily(6, 18); 

    } 
} 

Beispiel Console Befehl:

namespace App\Console\Commands; 
use Illuminate\Console\Command; 
use App\Classes\TlnnInfoCommunications; 

class SendData extends Command 
{ 
    /** 
    * The name and signature of the console command. 
    * 
    * @var string 
    */ 
    protected $signature = 'TLNN:SendData'; 
    /** 
    * The console command description. 
    * 
    * @var string 
    */ 
    protected $description = 'Description here...'; 
    /** 
    * Create a new command instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 
    /** 
    * Execute the console command. 
    * 
    * @return mixed 
    */ 
    public function handle() 
    { 
     $tlnnInfoCommunications = new TlnnInfoCommunications(); 
     $tlnnInfoCommunications->Run(); 
    } 
} 
+0

Haben Sie [scheduling] (https://laravel.com/docs/5.3/scheduling) in 'Kernel.php' berücksichtigt? –

+0

@ArminSam Ja Ich habe Aufgaben in Kernel.php geplant. Das ist das Problem beim Ausführen von Systemd – Dan

Antwort

1

Ich habe jetzt die Lösung.

Der Systemdienst 'Type' sollte auf 'forking' und nicht 'simple' gesetzt sein.

Daher löst die artisan.service auf die folgende Änderung der Ausgabe:

[Unit] 
Description=Artisan service 
After=network.target 

[Service] 
Type=forking 
Environment=TLNN=/opt/tlnn 
ExecStart=/usr/bin/php /srv/www/tlnn/artisan schedule:run 

[Install] 
WantedBy=multi-user.target 

kein 'systemctl Daemon-reload' zu vergessen, nach dem serivce zu verändern.

Verwandte Themen