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

Handle() function in console command not being invoked

我在使用 Laravel 的控制台命令时遇到问题。我的问题是,当 运行 我使用 systemd(而不是 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();
    }
}

我现在有了解决方案。

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'。