2016-10-19 18 views
1

Laravelのコンソールコマンドに問題があります。私の問題は、(crontabではなく)systemdを使用してConsoleカーネルでスケジュールされたジョブを実行しているときに、handle()関数が自動的に呼び出されないということです。コンソールコマンドのHandle()関数が呼び出されていない

私がしようとすると何が起こっているかをさらに明確にしましょう:

  • 「私の職人PHPを:」コマンドを呼び出す際にハンドル()関数が自動的に呼び出され、コンソール
  • からハンドル()関数であります
  • artisanをSYSTEMDタスクとして呼び出すことで、スケジュールされたジョブが実行されたときにhandle()関数が自動的に呼び出されることはありません。 ここで重要な違いは、crontabを使用するときにhandle()が呼び出されますが、systemdを使用するときはhandle()が呼び出されないことです。

systemdスケジューリングの知識を持っている人は誰ですか?これはなぜですか?システムジャーナルから私のコマンドがsystemdサービスによって呼び出されているのがわかりますが、handle()関数は呼び出されません。

なぜ、crontabを使用しないのですか?しかし、これは私が取ることができるアプローチではなく、とにかくうまくいかない理由を見ません。助けていただければ幸いです!

これは私に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); 

    } 
} 

例コンソールコマンド:

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

あなたは 'Kernel.php'で[スケジューリング](https://laravel.com/docs/5.3/scheduling)コマンドを考えましたか? –

+0

@ArminSamはい私はKernel.phpでスケジュールされたタスクを持っています。これは、systemdから実行すると問題になる – Dan

答えて

1

私は今、解決策を持っています。

システムタイプのサービス 'タイプ'は '単純化'ではなく 'フォーク'に設定する必要があります。

したがって、次のようにartisan.serviceを変更すると、問題が解決されています

[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 

serivceを変更した後、「systemctlデーモンリロード」を忘れないように。

関連する問題