未调用控制台命令中的Handle()函数

时间:2016-10-19 08:49:31

标签: php laravel artisan systemd

我在使用Laravel的控制台命令时遇到问题。我的问题是在使用systemd(而不是crontab)在Console内核中运行我的预定作业时,不会自动调用handle()函数。

让我试着进一步澄清正在发生的事情:

  • 从控制台调用'php artisan my:command'时会自动调用handle()函数
  • 通过调用ctontab中的artisan执行我的预定作业时,会自动调用handle()函数
  • 当我通过调用artisan作为SYSTEMD任务执行我的预定作业时,不会自动调用handle()函数。 这里的关键区别是在使用crontab时调用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();
    }
}

1 个答案:

答案 0 :(得分:1)

我现在有了解决方案。

systemd服务'Type'应设置为'forking'而不是'simple'。

因此,将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

更改服务后不要忘记'systemctl daemon-reload'。