Функция Handle() в консольной команде не вызывается

#php #laravel #laravel-artisan #systemd

#php #laravel #laravel-artisan #systemd

Вопрос:

У меня возникли проблемы с консольными командами Laravel. Моя проблема в том, что функция handle() не вызывается автоматически при выполнении моих запланированных заданий в консольном ядре с использованием systemd (а не crontab).

Позвольте мне попытаться уточнить, что происходит:

  • Функция handle() вызывается автоматически при вызове «php artisan my:command» с консоли
  • Функция handle() вызывается автоматически, когда мои запланированные задания выполняются путем вызова artisan в ctontab
  • Функция handle() НЕ вызывается автоматически, когда мои запланированные задания выполняются путем вызова artisan в качестве SYSTEMD-задачи. Ключевое отличие здесь в том, что handle() вызывается при использовании crontab, но не при использовании 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 AppConsole;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
use AppClassesInfoCommunications;
class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        AppConsoleCommandsSendData::class,
        AppConsoleCommandsRefreshData::class,
    ];
    /**
     * Define the application's command schedule.
     *
     * @param  IlluminateConsoleSchedulingSchedule  $schedule
     * @return void
     */
    protected function schedule( Schedule $schedule )
    {   
        $schedule->command( 'TLNN:SendData' )->cron( '*/1 * * * *' );
        $schedule->call( 'TLNN:RefreshData' )->twiceDaily( 6, 18 );

    }
}
  

Пример консольной команды:

 namespace AppConsoleCommands;
use IlluminateConsoleCommand;
use AppClassesTlnnInfoCommunications;

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. Вы рассматривали возможность планирования вашей команды в Kernel.php ?

2. @ArminSam Да, у меня запланированы задачи в Kernel.php . Именно они являются проблемой при запуске из systemd

Ответ №1:

Теперь у меня есть решение.

«Тип» службы systemd должен быть установлен на «разветвление», а не на «простой».

Следовательно, изменение 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’ после изменения serivce.